Перепишите этот ужас с нуля. Там невозможно найти ошибку.
Советую воспользоваться тем, что условные операторы вычисляются лениво: Если написать
A && B
и A окажется false, то B даже не будет вычисляться.
Так, проверка на клетку сверху может быть написана так:
if (i > 0 && a[i-1][j] - мина)
Так вся ваша простыня выродится в 8 последовательных проверок. Если меняются обе координаты, то надо через && объединить 3 условия - 2 на проверку невыхода за границы массива, и последнее - проверка значения массива.
Еще можно завести массив на SIZE+2 x SIZE+2 и заполнять его с (1, 1). Фактически, создается каемка вокруг исходного массива. И пробегаться по нему надо от 1 до SIZE. Так, вокруг всегда будут все 8 соседей. В этом подходе не придется проверять на выход за границы массива.
А еще можно вместо 8 if-ов сделать цикл на 8 итераций, если завести константы для приращений:
const int kDx[] = {1, 1, 1, 0, -1, -1, -1, 0};
const int kDy[] = {1, 0, -1, -1, -1, 0, 1, 1};
Теперь всех соседей можно перебрать как
(i + kDx[k], j + kDy[k])