Ниже моя попытка решить задачу о 8 ферзях, чтобы напечатать одно решение. (Расположите на шахматной доске 8 ферзей так, чтобы ни один из них не атаковал друг друга). Однако это решение размещает только 6 ферзей. Мне нужно другое мнение о том, где я делаю ошибку. Я делаю это скорее в стиле BFS, а не в обратном порядке.
решение восьми ферзей для получения решения
Ответы (1)
Кажется, ваш алгоритм работает со сбоями в какой-то момент. Запустив его, я обнаружил следующие проблемы:
Вы постоянно устанавливаете
visited[i][j]
в 0 в своем цикле for в main. Это всегда сбрасывает посещения на 0, даже если выполняется рекурсивный вызов. На самом деле, когда вы объявляете какvisited
, так иboard
, они инициализируются массивами, полными 0. Таким образом, вы можете избавиться от обоих операторов set. Кроме того, поскольку вы сбрасываете массивы, ваша рекурсивная функция в конечном итоге устанавливает оба значения в 0, а затем снова находит их.Для отладки в операторе
!hasQueen
вы должны вывести координатыboard[row][col]
, которые показывают вам найденные координаты. Окончательный список перед печатью сетки показывает, что 2,4 и 1,6 найдены и установлены дважды.Фактическая шахматная доска, которая выводится, заканчивается невозможным решением:
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0
0 0 0 X 0 Y 0 0
0 0 0 Y 0 X 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
(извините, я не могу получить номера в формате)
И расклад X, и расклад Y не соответствуют правилам восьми ферзей.
Если вы запустите свою программу с закомментированным параметром 0, вы увидите, что она останавливается после нахождения 6 местоположений.