Ваша проблема в функции ok
.В ней три ошибки, все они относятся к границам вашей матрицы.Первая ошибка (которая может привести к тому, что вы получите слишком много решений):
for(int c = 7; c > 0; c--){
Это никогда не будет проверять столбец 0. Тест должен быть c >= 0
.
Здесь есть две другие ошибки, которые вызывают непредсказуемое поведение:
for(int i = 1; i <= c; i++){
if(board[r][c-i] == 1)
return false;
else if (board[r-i][c-i] == 1)
return false;
else if (board[r+i][c-i] == 1)
return false;
} // for loop
Это может привести к тому, что функция ok
вернет произвольное количество ложных отрицаний.В моем случае компиляция и запуск вашей программы с этими двумя ошибками не дали решения.Только случайно он дает вам 40 решений.
Проблема снова в границах.Переменная i
перемещается от 1 до c
включительно, поэтому c-i
перемещается вниз с c-1
до 0
, как и предполагалось.
Однако вы не проверяете, что r-i
и r+i
остаются в пределах матрицы.Рассмотрим случай, когда r = 7
и i = 4
.Затем r+i = 11
, который проходит за конец ряда.Точно так же, если r = 0
и i
отличны от 0, r-i
будет отрицательным и будет проходить после начала строки.
Вам необходимо добавить дополнительные проверки, чтобы убедиться, что значения строкииспользуемые в тестах в этом цикле находятся в диапазоне от 0 до 7. Для этого можно использовать поведение короткого замыкания логических операторов в C ++, например:
else if (<test> && board[r-i][c-i] == 1)
будет проверять board[r-i][c-i]
только если <test>
истинно.
Я оставляю добавление исправлений к этим вторым двум ошибкам в качестве упражнения для вас, поскольку это, скорее всего, будет домашним заданием (и если это так,Вы должны добавить тег [домашнее задание] к вопросу).