You are on page 1of 1

(defun n-queens (dimension)

(macrolet ((row (x) `(car ,x))


(col (x) `(cdr ,x)))
(labels ((in-threat (pos1 pos2)
(or (= (row pos1) (row pos2)) (= (col pos1) (col pos2))
(= (- (row pos1) (col pos1)) (- (row pos2) (col pos2)))
(= (+ (row pos1) (col pos1)) (+ (row pos2) (col pos2)))))
(test-pos (pos1 partial-soln)
(dolist (pos2 partial-soln t)
(when (in-threat pos1 pos2)
(return nil))))
(all-cols (row) (loop for col below dimension collecting (cons row
col))))
(do ((row 1 (1+ row))
(candidates (all-cols 1))
(solns (mapcar #'list (all-cols 0))))
((>= row dimension) (mapcar #'nreverse solns))
(setf candidates (all-cols row)
solns (loop for soln in solns
for res = (loop for pos in candidates
when (test-pos pos soln)
collect (cons pos soln))
unless (null res)
append res))))))

You might also like