Как мне проверить соседей окружающих меня ячеек в 2D-массиве (C )?

#c #multidimensional-array

#c #многомерный массив

Вопрос:

Итак, я пытаюсь проверить, имеют ли ячейки, окружающие текущую ячейку любого данного 2D-массива, определенное значение (0 или 1), и в зависимости от значения, которое я хочу подсчитать общую сумму (всего 1 значения, окружающие текущую ячейку), однако я не уверен, как захватить позиции, приведенные ниже, — это некоторый псевдокод, который я написал, который, я думаю, рассмотрит каждую общую позицию для ячейки, в которой она находится, однако я не совсем уверен, что это правильно, и если это правильно, я не уверен, как чтобы захватить окружающие клетки. Нет необходимости выписывать весь код, но в основном я ищу условия для позиций для проверки в будущих вложенных операторах if, которые будут из этих больших операторов if, таких как array if array([xPosition 1][yPosition 1] == 1)

Вот pesudocode

 if (xPosition==0 amp;amp; yPosition==0) {


    } else if (xPosition==rows amp;amp; yPosition==columns) {

    } else if (xPosition==rows amp;amp; yPosition==0) {

    } else if (xPosition==0 amp;amp; yPosition==columns) {

    } else if (xPosition==0) {

    } else if (xPosition==rows) {

    } else if (yPosition==0) {

    } else if (yPosition==columns) {

    } else {

    }
  

Комментарии:

1. Почему вы пытаетесь это сделать? В общем случае вам нужно просто сопоставить ваш currentCellIndex или — 1 с границами вашей карты, чтобы предотвратить доступ к чему-либо за пределами вашей карты, и когда currentCellIndex /- 1 находится внутри вашей карты, подсчитайте это значение.

2. Это для задания, в котором я должен запустить симуляцию, правила указывают, что в зависимости от окружающих ячеек текущая ячейка может перейти из состояния заполненной в состояние не заполненной или наоборот. Итак, мне нужно знать, заполнены ли окружающие ячейки или нет.

3. Это звучит как игра жизни Конвея , которая является обычной задачей для обучения. Простой трюк заключается в том, чтобы увеличить массив (с границей). Таким образом, вам не нужно проверять границы при чтении. Вам просто нужно настроить циклы для оценки / записи, чтобы пропустить граничные ячейки.

Ответ №1:

Вы можете использовать вложенные циклы

 int sum{0};
for (int x{std::max(xPosition, 1) - 1}; x < std::min(xPosition   2, columns);   x) {
    for (int y{std::max(yPosition, 1) - 1}; y < std::min(xPosition   2, rows);   y) {
        if (x == xPosition amp;amp; y == yPosition) continue;
        sum  = array[x][y];
    }
}
  

Ответ №2:

Код не требует пояснений, и я добавил комментарии

 bool isSafe(int xPosition, int yPosition, 
        int rows, int columns) { // checking the boundry
            return (xPosition >= 0 amp;amp; xPosition < rows amp;amp;
                yPosition >= 0 amp;amp; yPosition < columns);
        }


void checkNeighbours(int xPosition, int yPosition, 
                        int rows, int columns) {
        // Considering only 4 directions up, down , right, left                    
        int count = 0;
        if(isSafe(xPosition - 1, yPosition)) { // one cell up
            if(array[xPosition - 1][yPosition] == 1) {
                count   ;
            }
        }           

        if(isSafe (xPosition   1, yPosition)) { // one cell down
            if(array[xPosition   1][yPosition] == 1) {
                count   ;
            }
        }

        if(isSafe(xPosition, yPosition - 1)) { // one cell left
            if(array[xPosition][yPosition - 1] == 1) {
                count   ;
            }
        }

        if(isSafe(xPosition, yPosition   1)) { // one cell right
            if(array[xPosition][yPosition   1] == 1) {
                count   ;
            }
        }

        // use count for whatever
    }