81 lines
1.9 KiB
Common Lisp
81 lines
1.9 KiB
Common 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 "%d solutions in total" (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)
|
|
)
|