ОБНОВЛЕНО: Теперь код должен компилироваться без ошибок или предупреждений. Извините за предыдущий. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что при запуске (или с любым другим целым числом)
(NxNqueen-solver 10)
Функция getqueencol вернет nil, потому что на доске изначально нет ферзей, следовательно, в здесь-можно-поместить-ферзя будет (= число nil) потому что tcol будет равен нулю. Я думаю, что это будет происходить каждый раз, когда в строке, переданной в качестве аргумента функции ферзь, которую можно разместить, нет ферзя.
Поделитесь, пожалуйста, советом, как решить эту проблему. Заранее спасибо.
Вот код
(defvar *board* (make-array '(10 10) :initial-element nil))
(defun getqueencol (row n)
"Traverses through the columns of a certain row
and returns the column index of the queen."
(loop for i below n
do (if (aref *board* row i)
(return-from getqueencol i))))
(defun print-board (n)
"Prints out the solution, e.g. (1 4 2 5 3),
where 1 denotes that there is a queen at the first
column of the first row, and so on."
(let ((solutionlist (make-list n)))
(loop for row below n
do (loop for col below n
do (when (aref *board* row col)
(setf (nth row solutionlist) col))))
(print solutionlist)))
(defun queen-can-be-placed-here (row col n)
"Returns t if (row,col) is a possible place to put queen, otherwise nil."
(loop for i below n
do (let ((tcol (getqueencol i n)))
(if (or (= col tcol) (= (abs (- row i)) (abs (- col tcol))))
(return-from queen-can-be-placed-here nil)))))
(defun backtracking (row n)
"Solves the NxN-queen problem with backtracking"
(if (< row n)
(loop for i below n
do (when (queen-can-be-placed-here row i n)
(setf (aref *board* row i) 't)
(return-from backtracking (backtracking (+ row 1) n))
(setf (aref *board* row i) 'nil))
(print-board n))))
(defun NxNqueen-solver (k)
"Main program for the function call to the recursive solving of the problem"
(setf *board* (make-array '(k k) :initial-element nil))
(backtracking 0 k))
(return-from getmarkedcol)
внутриgetqueencol
; вы делаете(setq solutionlist ...)
без определенияsolutionlist
, в(let (tcol (getqueencol i))
есть искаженныйlet
и т. д. Более того, вы не должны использоватьdefvar
внутри функции. - person Renzo   schedule 23.09.2015'(pi pi)
aka.(quote pi pi)
и(list pi pi)
? 2. Сколько ферзей нужно учитывать при размещении i-го ферзя? 3. Что заставляетqueen-can-be-placed-here
возвращать что угодно, кроме нуля? 4. Какова цель вызоваreturn-from
вbacktracking
? Надеемся, что после этого программа заработает, и вы сможете получить пользу от отправки ее на codereview.stackexchange.com. - person Terje D.   schedule 24.09.2015'(pi pi)
и(list pi pi)
. Вопрос 3: Я добавил(return-from queen-can-be-placed-here t)
вне цикла, чтобы он также мог возвращать TRUE. Вопрос 4: Я удалил операторreturn-from
вbacktracking
. Я не думаю, что есть цель завершить код на этом этапе. Вопрос 2: Поскольку я использую возврат, должно быть достаточно рассмотреть i-го - 1 ферзя, верно? Но это были у меня проблемы. Мойgetqueencol
всегда возвращаетnil
, когда в определенном ряду нет ферзя... Пожалуйста, помогите мне! - person Richard Berg   schedule 25.09.2015getqueencol
в рядах, где еще нет ферзя. - person Terje D.   schedule 25.09.2015queen-can-be-placed-here
и проверять, есть ли там королева или нет. То, что я не - person Richard Berg   schedule 25.09.2015queen-can-be-placed-here
, которая знает, есть ли в определенной строке ферзь или нет. Но какую проверку я могу сделать, чтобы определить, является ли это возможной позицией для ферзя? Я не могу использовать тот, который уже написан вqueen-can-be-placed-here
, я полагаю, потому что он используетtcol
, который нельзя использовать, если в ряду нет ферзя. заранее спасибо - person Richard Berg   schedule 25.09.2015getqueencol
напрасно: Может стоит просто зациклитьbelow row
вqueen-can-be-placed-here
. - person Terje D.   schedule 25.09.2015