Проверка смежных индексов в 2-мерном массиве

Я должен написать тральщик.
Я нашел способ проверить соседние индексы, чтобы подсчитать, сколько бомб окружает текущий индекс, не выходя за пределы. Но это долго, некрасиво и, скорее всего, неэффективно.
Это просто набор условных выражений для каждой уникальной ячейки, которые потенциально могут выйти за пределы. У меня вопрос, есть ли более короткий способ сделать это? И будет ли реализация одномерного массива деформации сделать это легче / сложнее?

int count = 0;
for (int i = 0; i < WIDTH; i++){
for (int j = 0; j < HEIGHT; j++){
**// index 0,0**
if (i == 0 && j == 0 && field[i][j] != 10){
if (field[i][j + 1] == 10)
count++;
if (field[i + 1][j] == 10)
count++;
if (field[i + 1][j + 1] == 10)
count++;
}
**// index 0,9**
else if (i == 0 && j == HEIGHT - 1 && field[i][j] != 10){
if (field[i][j - 1] == 10)
count++;
if (field[i + 1][j - 1] == 10)
count++;
if (field[i + 1][j] == 10)
count++;
}

**// index 9,0**
else if (i == WIDTH - 1 && j == 0 && field[i][j] != 10){
if (field[i - 1][j] == 10)
count++;
if (field[i][j + 1] == 10)
count++;
if (field[i - 1][j + 1] == 10)
count++;
}

**// index 9,9**
else if (i == WIDTH - 1 && j == HEIGHT - 1 && field[i][j] != 10){
if (field[i - 1][j] == 10)
count++;
if (field[i][j - 1] == 10)
count++;
if (field[i - 1][j - 1] == 10)
count++;
}

**// if first row**
else if (i == 0 && (j != 0 && j != HEIGHT - 1) && field[i][j] != 10){
if (field[i][j - 1] == 10)
count++;
if (field[i + 1][j - 1] == 10)
count++;
if (field[i + 1][j] == 10)
count++;
if (field[i + 1][j + 1] == 10)
count++;
if (field[i][j + 1] == 10)
count++;
}

**// if last row**
else if (i == WIDTH - 1 && (j != 0 && j != HEIGHT - 1) && field[i][j] != 10){
if (field[i][j - 1] == 10)
count++;
if (field[i - 1][j - 1] == 10)
count++;
if (field[i - 1][j] == 10)
count++;
if (field[i - 1][j + 1] == 10)
count++;
if (field[i][j + 1] == 10)
count++;
}

**// if first col**
else if (j == 0 && (i != 0 && i != HEIGHT - 1) && field[i][j] != 10){
if (field[i - 1][j] == 10)
count++;
if (field[i - 1][j + 1] == 10)
count++;
if (field[i][j + 1] == 10)
count++;
if (field[i + 1][j] == 10)
count++;
if (field[i + 1][j + 1] == 10)
count++;
}

**// if last col**
else if (j == HEIGHT - 1 && (i != 0 && i != WIDTH - 1) && field[i][j] != 10){
if (field[i - 1][j - 1] == 10)
count++;
if (field[i - 1][j] == 10)
count++;
if (field[i][j - 1] == 10)
count++;
if (field[i + 1][j - 1] == 10)
count++;
if (field[i + 1][j] == 10)
count++;
}

**// Cells that are fully surrounded**
else if (field[i][j] != 10){
if (field[i - 1][j - 1] == 10)
count++;
if (field[i - 1][j] == 10)
count++;
if (field[i - 1][j + 1] == 10)
count++;
if (field[i][j - 1] == 10)
count++;
if (field[i][j + 1] == 10)
count++;
if (field[i + 1][j - 1] == 10)
count++;
if (field[i + 1][j] == 10)
count++;
if (field[i + 1][j + 1] == 10)
count++;
}if (field[i][j] != 10)
field[i][j] = count;
count = 0;
}
}

0

Решение

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

static int moves[8][2] = {{-1,0}, {-1, -1}, {0, -1}, {1, -1}, {1, 0}, {1, 1}, {0, 1}, {-1, 1}};
for (int i = 0; i < WIDTH; i++) {
for (int j = 0; j < HEIGHT; j++) {
for (int l = 0; l < 8 /*sizeof(move) / sizeof(move[0]) */; ++l) {
int ti = i + move[l][0];
int tj = j + move[l][1];
if (ti < 0 || ti >= WIDTH || tj < 0 || tj >= HEIGHT) {
continue;
}
// cell (ti, tj) is valid neighbor do something with it.
}
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]