
(let ((*result* '()))
  (message "--------------------")
  (message "====================")
  (message ">>>>>>>>>>>>>>>>>>>>")
  (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)
    ;;(message "chess count: %d n: %d" (chess-cnt chess-map) n)
    (if (< (chess-cnt chess-map) n)
	(progn
	  (message "chess count: %d n: %d" (chess-cnt chess-map) n)
	  (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
		       ;;(message "empty place found at: %d" i)
		       ;; 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)))	
	(message "Add result to list.")
	)
      )
    )

  (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 7)
  ;;(message "%s" *result*)
  )
