N-queens problem: Difference between revisions
Content added Content deleted
m (→{{header|Quackery}}: tweaked commentary) |
(Add emacs lisp) |
||
Line 5,084: | Line 5,084: | ||
11 Queen : 2680 |
11 Queen : 2680 |
||
12 Queen : 14200 |
12 Queen : 14200 |
||
</pre> |
|||
=={{header|Emacs Lisp}}== |
|||
<syntaxhighlight lang="lisp"> |
|||
(let ((*result* '())) |
|||
(defun grid-cnt (n) |
|||
(* n n) ) |
|||
(defun x-axis (n pos) |
|||
(/ pos n) ) |
|||
(defun y-axis (n pos) |
|||
(% pos n) ) |
|||
(defun chess-cnt (chess-map) |
|||
(seq-count (lambda (x) x) chess-map)) |
|||
(defun check-conflict (n chess-map pos) |
|||
(let ((is-conflict nil)) |
|||
(cl-loop for i from 0 to (1- (grid-cnt n)) while (not is-conflict) do |
|||
(when (aref chess-map i) |
|||
(when (or (= (x-axis n i) (x-axis n pos)) |
|||
(= (y-axis n i) (y-axis n pos)) |
|||
(= (abs (- (x-axis n i) (x-axis n pos))) |
|||
(abs (- (y-axis n i) (y-axis n pos)))) |
|||
) |
|||
(setq is-conflict 't) |
|||
) |
|||
) |
|||
) |
|||
is-conflict ) |
|||
) |
|||
(defun place-chess (n chess-map start-pos) |
|||
(if (< (chess-cnt chess-map) n) |
|||
(progn |
|||
(let () |
|||
(cl-loop for i from start-pos to (1- (grid-cnt n)) do |
|||
(when (not (aref chess-map i)) ;; check if place is empty |
|||
;; check if place is on hold by other chess |
|||
(when (not (check-conflict n chess-map i)) |
|||
(let ((map1 (copy-sequence chess-map))) |
|||
(aset map1 i 't) |
|||
(place-chess n map1 i) |
|||
) |
|||
) |
|||
) |
|||
) |
|||
) |
|||
) |
|||
(progn |
|||
(if *result* (nconc *result* (list chess-map)) (setq *result* (list chess-map))) |
|||
) |
|||
) |
|||
) |
|||
(defun show-result (n) |
|||
(let () |
|||
(seq-map (lambda (map1) |
|||
(let ((map-txt "")) |
|||
(message ">>>>>>>>>>>>>>") |
|||
(seq-map-indexed (lambda (elm idx) |
|||
(if (= (% idx n) 0) |
|||
;;(setq map-text (concat map-txt "\n")) |
|||
(progn |
|||
(message map-txt) |
|||
(setq map-txt "") ) |
|||
) |
|||
(setq map-txt |
|||
(concat map-txt (if elm "✓" "⓪"))) |
|||
) map1) |
|||
(message "<<<<<<<<<<<<<<\n") |
|||
) |
|||
) *result*) |
|||
) |
|||
(message "totally %d solutions" (length *result*)) |
|||
) |
|||
(defun start-calculate (n) |
|||
(let ((chess-map (make-vector (grid-cnt n) nil))) |
|||
(place-chess n chess-map 0) |
|||
) |
|||
(show-result n) |
|||
) |
|||
(start-calculate 8) |
|||
) |
|||
</syntaxhighlight> |
|||
<pre> |
|||
... |
|||
totally 92 solutions |
|||
</pre> |
</pre> |
||