N-Queen(1)

N-Queen問題を、いくつかの方法で解いてみる。

とりあえず、一番簡単・簡潔だと思うのは、次のコード。
参照: nlet-acc

;; row番目に新たなqueenを置けるかチェック
(defun check (row queens &optional (r 1))
  (or (null queens) 
      (and (/= (car queens) row (+ row r) (- row r)) 
	   (check row (cdr queens) (1+ r)))))

(defun n-queen (n)
  (nlet-acc self (queens (col n))
    (if (zerop col)
        (accumulate queens) 
      (dotimes (row n)
        (when (check row queens)
          (self (cons row queens) (1- col)))))))