22 lines
871 B
Common Lisp
22 lines
871 B
Common Lisp
(defun queens2 (n)
|
|
(let ((a (make-array n))
|
|
(u (make-array (+ n n -1) :initial-element t))
|
|
(v (make-array (+ n n -1) :initial-element t))
|
|
(m 0))
|
|
(dotimes (i n) (setf (aref a i) i))
|
|
(labels ((sub (i)
|
|
(if (= i n)
|
|
;(push (copy-seq a) s)
|
|
(incf m)
|
|
(loop for k from i below n do
|
|
(let ((p (+ i (aref a k)))
|
|
(q (+ (- i (aref a k)) n -1)))
|
|
(when (and (aref u p) (aref v q))
|
|
(setf (aref u p) nil (aref v q) nil)
|
|
(rotatef (aref a i) (aref a k))
|
|
(sub (1+ i))
|
|
(setf (aref u p) t (aref v q) t)
|
|
(rotatef (aref a i) (aref a k))))))))
|
|
(sub 0))
|
|
m))
|