После решения моей ошибки со списком значений и возможности запуска моей программы до конца, я обнаружил, что моя диагональная проверка, похоже, имеет логическую ошибку. Мой ввод выглядит следующим образом:Ошибка при проверке диагонали - nQueens
(THREAT? '(1 3)' ((1 0) (2 4) (3 0) (4 0) (5 0) (6 0) (7 0) (8 0)))
Первый аргумент, который мы тестируем, является одобренным или не размещающим королеву, а вторым аргументом является состояние платы, y значения 1-8 определяют позиции столбца части и значение 0 указывает, что строка значений x не будет содержать кусок. Мой код выглядит следующим образом:
(defun diagonal(point1 point2)
(= (abs (- (car point1) (car point2)))
(abs (- (cadr point1) (cadr point2))))
)
(defun THREAT?(x y)
; Checks threat on the vertical
(when (not (eq (values-list (cdr (nth (- (car x) 1) y))) '0))
(return-from THREAT? t)
)
(loop for i from 0 to (list-length y)
; Checks threat on the horizontal
when (eq (values-list (cdr x )) (values-list (cdr (nth i y))))
do (return-from THREAT? t)
; With the help of the diagonal function checks along the diagonal
when (diagonal x (nth i y))
do (return-from THREAT? t)
)
)
Если мое понимание правильно, моя программа должна проходить через каждый элемент y. Он передаст x и текущую пару y в диагональную функцию. Диагональная функция будет за вычетом двух и абсолютного значения и проверяет, равны ли они (если они диагональны, то они должны быть равны (1 2) и (2 3) диагональны и, следовательно, | 1 - 2 | = 1 и | 2 - 3 | = 1). Диагональная функция должна возвращать значение true, если эти числа эквивалентны. Соответствующий оператор when должен активироваться только тогда, когда он получает истинное значение от диагональной функции, и все же он всегда возвращает true, даже когда я даю программе полностью пустую доску. Как исправить диагональ, чтобы правильно определить угрозу на доске? Любая помощь очень ценится!
У вас еще есть ЗНАЧЕНИЯ-LIST в коде ... Зачем? –
Я удалил их сверху, где они вызывали ошибки. Просто в двух других проверках они не вызывают никаких проблем и работают правильно, поэтому я их сохранил, но я мог удалить их и отредактировать сообщение, если они действительно не нужны или мешают. –
VALUES-LIST не имеет смысла. (VALUES-LIST (CDR x)) является просто (второй x). Вы должны написать чистый код. –