Nick McCaffery Ответов: 3

Как мне решить эту игру жизни задание на C++


Я пытаюсь закодировать этот вопрос, но на самом деле не уверен, как это сделать, если кто-то может предложить какое-либо представление о том, как это можно закодировать, дайте мне знать.

2. game_of_life
Что такое игра жизни?
Не путать с "игрой жизни" Хасбро, эта проблема относится к знаменитой клеточной автоматизации британского математика Джона Конвея. Термин "клеточная автоматизация" относится к пространству (в данном случае к сетке) ячеек, которые непрерывно трансформируются для создания новых моделей и состояний, основанных на состояниях соседних ячеек, следуя дискретному набору математических правил. Имитационные модели клеток, живущих, умирающих и размножающихся в течение нескольких поколений.

правила
Любая живая клетка, имеющая менее двух живых соседей, умирает (как будто из-за недостаточной заселенности).
Любая живая клетка с более чем тремя живыми соседями умирает (как будто от перенаселения/перенаселенности).
Любая живая клетка с двумя или тремя живыми соседями живет, не меняясь, до следующего поколения.
Любая мертвая клетка с ровно тремя живыми соседями оживет (как бы при реанимации или рождении).
Соседи относятся к восьми ячейкам, смежным с любой заданной ячейкой в сетке, за исключением граничных ячеек.

назначение
Для этого задания мы просим вас реализовать игру жизни Конвея, используя двумерный массив в качестве сетки, в которой будут храниться ячейки. Живые клетки обозначаются символами*, мертвые-символами the . характер.

Ввод
В качестве входных данных вам будет дана строка, содержащая количество строк, количество столбцов и количество поколений для моделирования в виде m n g, за которой следуют m строк, содержащих начальное состояние сетки. 3 <= m,n <= 20 и 0 <= g <= 50

Например, сетка 4 х 5, на которой должны быть смоделированы 7 поколений жизни, будет дана следующим образом:

4 5 7
. * * . .
. * . . .
* * * . *
. . . . *
Вы должны хранить это начальное состояние сетки в многомерном массиве, как описано в классе.

ваша задача
Начальное состояние (поколение 0) хранится в сетке.

. * * . .
. * . . .
* * * . *
. . . . *
Затем вы должны вычислить следующее поколение (поколение 1), применив правила к сетке предыдущего поколения (в данном случае поколение 0).

Состояние сетки после вычисления поколения 1 должно быть следующим:

. * * . .
. . . * .
* * * * .
. * . * .
Важное примечание: "[поколение n] создается путем одновременного применения правил [...] к каждой клетке в [поколении n-1] — рождение и смерть происходят одновременно" (Википедия). Это означает, что при применении правил к n-1 для вычисления/создания n вы не должны ни в коем случае изменять значения в n-1, а только соблюдать их. Только после того, как n было засеяно, вы должны изменить n-1.

Повторите описанный выше процесс g раз, пока ваша сетка не будет в своем окончательном состоянии. Это означает, что если вы получаете g = 0, ваше начальное и конечное состояние будут одинаковыми.

Выход
Ваш вывод должен быть конечным состоянием сетки после того, как g generations будет напечатан в std::cout в приведенном выше формате.

Примечание: ваша печатная сетка не должна содержать конечных пробелов в конце каждой строки.

Что я уже пробовал:

Я не уверен, с чего начать кодирование этой проблемы, поэтому любая помощь будет оценена по достоинству.

Richard MacCutchan

Во многом та же проблема, что и ваш скользящий вопрос-головоломка.

3 Ответов

Рейтинг:
2

Stefan_Lang

Чтобы начать работу, вы должны понимать, что все задания по программированию сводятся к следующим шагам:

1. Чтение входной информации
2. Настройка и инициализация некоторых структур данных
3. Обработки ваших данных
4. Представьте результаты
Иногда шаги 3 и 4 могут повлиять на определение и настройку структур данных. Но для первого проекта это обычно не требуется.

Обычно есть некоторые дополнительные шаги, которые необходимо выполнить между ними, или шаги, которые повторяются, но эти четыре шага почти всегда есть.

Поэтому вам следует проверить свои задания и выяснить это
- а что тут читать
- какие структуры данных вам нужны
- что вы должны делать с этими данными
- что вы должны отображать в качестве вывода

К счастью, Ваше задание уже структурировано, чтобы предоставить эту информацию очень четко:

Начните с рассмотрения абзацев "назначение" и "ввод". Они дают вам достаточно информации, чтобы определить структуры данных для вашей программы.

В разделе "задание" вы найдете описание того, что нужно сделать. Напишите функцию, которая принимает входные структуры данных и обрабатывает их, как описано здесь.

Раздел "вывод" предлагает четкие инструкции, что отображать в конце. Я не думаю, что это должно быть проблемой после решения предыдущих шагов.


Patrice T

Я бы поменял местами 1 и 2.
+5

Stefan_Lang

Да, может быть. Спасибо за голосование.

Рейтинг:
1

Patrice T

Цитата:
Я пытаюсь закодировать этот вопрос, но не совсем уверен, как это сделать

Есть простой способ получить это знание, просто попробуйте и посмотрите, какая часть работает, а какая нет, а затем уточните. Это обучение методом проб и ошибок.
Как программист, ваша задача - создавать решения для ваших проблем.

Совет: изучите один или несколько методов анализа, E. W. Djikstra/N. Уирт Stepwize уточнение/метод сверху вниз это хорошее начало.
Структурного Программирования.формат PDF[^]
https://en.wikipedia.org/wiki/Top-down_and_bottom-up_design[^]
https://en.wikipedia.org/wiki/Structured_programming[^]
https://en.wikipedia.org/wiki/Edsger_W._Dijkstra[^]
https://www.cs.utexas.edu/users/EWD/ewd03xx/EWD316.PDF[^]

Когда у вас есть большая проблема, разделите ее на несколько меньших/более простых проблем, как только каждая маленькая проблема будет решена, большая тоже будет решена.
- Чтение ввода, вероятно, будет первым шагом.
- Играю в игру жизни посередине.
- дача результата последний шаг.

До сих пор вы не показывали никакой работы и не задавали вопроса.


Рейтинг:
0

Rick York

Начните с разбиения проблемы на ряд шагов, которые необходимо выполнить. Сначала вам нужно выяснить свою схему хранения. Поскольку вам были даны ограничения по размеру, он может быть либо статическим, либо динамическим. То, что вы обсуждали в классе, вероятно, ваш лучший вариант. После этого вам нужно написать логику, чтобы принять входные данные, которые определяют игру. Следующим шагом является выполнение логики поколений симуляции. Наконец, отобразите состояние симуляции.

Поскольку это ваша работа, я не собираюсь писать для вас никакой код. Если вы сделаете каждый из этих шагов, вы должны быть в состоянии получить эту программу написана. Вы всегда можете обратиться за помощью, но мы здесь, чтобы помочь вам с вашим кодом, а не писать его для вас.

Я дам вам один намек. Поскольку игра представляет собой ячейки, содержащие один из двух символов, я бы сделал каждую строку ячеек массивом символов. Каждая ячейка будет иметь точку или звездочку. Я не знаю, что вы узнали до сих пор, поэтому я не могу описать, как вы должны хранить эти данные.


Patrice T

+5