#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
}