Я так понял, вы там перебираете 8 соседей клетки на замкнутом поле (после последней строки идет первая, перед певрой идет последняя и так же для столбцов). Вам поможет опреация взятия остатка от деления (она же деление по модулю).
Можно так:
for (int dx = -1; dx <= 1; ++dx) {
for (int dy = -1; dy <= 1; ++dy) {
if (dx == 0 && dy == 0) continue;
int nx = (i + dx + height) % height;
int ny = (j + dy + SIZE) % SIZE;
neighbours += proc_states[iter][nx * SIZE + ny];
}
}
Или можно завести
const int dx[8] = {0, 1, 1, 1, 0, -1, -1, -1};
const int dy[8] = { 1, 1, 0, -1, -1, -1, 0, 1};
...
for (int k = 0; k < 8; ++k) {
int nx = i + dx[k];
int ny = j + dy[k];
...
}
Можно не заводить временные переменные и ужать код до двух строк.
В конструкции
(i + dx + SIZE) % SIZE
есть лишний
+SIZE
, ибо
-1 % SIZE == -1
и чтобы для 0 предыдущее значение было SIZE-1 надо прибавить лишний SIZE под модулем.