Проблемы с многомерными массивами

В качестве домашнего задания мне нужно представить ячейки во вселенной, где '*' указывает на живую ячейку, а пустое место (' ') — на мертвую. Для определения статуса конкретной клетки в следующих поколениях используются следующие правила:

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

Например, рассмотрим следующие массивы:

int[][] beehive = {{0,0,0,0,0,0}, {0,0,1,1,0,0}, {0,1,0,0,1,0}, 
{0,0,1,1,0,0}, {0,0,0,0,0,0}};
int[][] toad = {{0,0,0,0,0,0}, {0,0,1,1,1,0}, {0,1,1,1,0,0}, {0,0,0,0,0,0}};

getNextGenCell(beehive, 1, 3) returns 1, while getNextGenCell(beehive, 3, 1) 
returns 0.
getNextGenCell(toad, 0, 3) returns 1, while getNextGenCell(toad, 2, 3) 
returns 0.

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

Мой код должен иметь следующий заголовок, где int x представляет подмассив, а int y представляет элемент внутри этого подмассива. Код возвращает 1, если ячейка жива в следующем поколении, или 0 в противном случае.

    // A method that gets the cell from the next generation

    public static int getNextGenCell(int[][] validUniverse, int x, int y) {


    }

Люди здесь могут быть немного «придирчивыми», когда дело доходит до ответов на вопросы. Вы хорошо объясняете свое домашнее задание, но вам нужно объяснить, что именно вас смущает в том, как действовать дальше. Инструкции, которые вы предоставили, кажутся ясными, так что же вы в них не понимаете? Это также помогает рассказать людям, что вы пробовали и почему это не дало вам желаемого или ожидаемого результата. Удачи!

Dan Forbes 25.03.2019 22:33

@DanForbes Я не понимаю, как начать писать код. Я ищу любое предложение или совет о том, как действовать.

Elizabeth 25.03.2019 22:36

Для заданных координат x, y, как бы вы определили соседей? Сначала разработайте алгоритм, а затем попытайтесь написать соответствующий код.

KevinO 25.03.2019 22:36

@KevinO Я думал о вложенных циклах for, но это кажется таким неэффективным.

Elizabeth 25.03.2019 22:37

@Elizabeth - я бы посоветовал вам посетить рабочее время и поработать с ТА или вашим профессором по таким базовым вопросам.

Dan Forbes 25.03.2019 22:39

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

KevinO 25.03.2019 22:41

Вложенные циклы for могут показаться «неэффективными», но иногда «неэффективное» решение является правильным решением. Это один из тех моментов.

Kevin Anderson 25.03.2019 22:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
7
58
1

Ответы 1

Сначала вы должны определить, как вы хотите, чтобы логика вашей программы работала. В этом случае вы знаете, что при обходе двумерного массива есть 8 различных случаев. Это включает:

  • Верхний левый угол
  • Верхний правый угол
  • Остаток первого ряда
  • Нижний левый угол
  • Нижний правый угол
  • Остаток последней строки
  • Левая и правая части массива
  • Остальная часть массива

Вам понадобятся операторы if для каждого из этих случаев. Ниже приведен пример кода для случая «остальная часть массива»:

 if (x!=0&&y!=0&&x!=bees.length-1&&y!=bees[x].length-1&&bees[x][y+1]==1||bees[x][y-1]==1||bees[x+1][y]==1||bees[x-1][y]==1)

Теперь просто закончите остальные 7 случаев, подсчитайте количество «живых» или «мертвых» ячеек и соответствующим образом измените массив. Дайте знать, если у вас появятся вопросы.

Другие вопросы по теме