;; ****************************************************************
;; 注释在后面
;; Exercise 2.42
(define (solve n)
(define (single-try row col total-columns data)
(if (safe? row col data)
(if (= row (- n 1))
(my-print (append data (list (list row col))))
(let ((proc (lambda (x)
(single-try (+ 1 row)
x
total-columns
(append data (list (list row col)))))))
(map proc (enumerate-interval 0 (- total-columns 1)))))
#f))
(map (lambda (x) (single-try 0 x n '()))
(enumerate-interval 0 (- n 1))) (void))
(define (my-print data)
(print data) (newline))
(define (safe? row col data)
(define (array-and sequence)
(define (iter sequence result)
(if (or (null? result) (not result))
#f
(if (null? sequence)
#t
(iter (cdr sequence) (and result (car sequence))))))
(iter sequence #t))
(define (test r1 c1 r2 c2)
(cond ((= r1 r2) '())
((= c1 c2) '())
((= (- r1 c1) (- r2 c2)) '())
((= (+ r1 c1) (+ r2 c2)) '())
(else #t)))
(if (null? data)
#t
(array-and
(map (lambda (point) (test row col (car point) (cadr point)))
data))))
;; 开始写注释
;; solve n 解决一个n*n的皇后问题,将结果输出,返回(void),无结果则不输出
;; (data)以这种方式存储当前的点'((0 0) (1 1) (2 3) etc)
;; single-try 测试点row col,若可以落子,通过对下一行所有位置的递归,
;; 给出这个位置所有可能的解。
;; 递归出口,若这是最后一行,显然只有一种可能性,则直接打印结果。
;; 最开始的时候逐个检测第一行的点。
;; 关于safe?
;; 测试点row col是否安全,通过逐个与data里已经存在的点比较。
;; 写个array-and是因为不知道为什么(accumulate and #t sequence)会出错。
;; array-and里稍乱是因为对这个scheme的'()究竟代表什么不好说。
;; 2013-01-24 Thursday 21:28:56
;; 开始还聊天着,现在终于出来了。
菜鸟用scheme对八皇后问题的一个实现
最新推荐文章于 2024-09-07 23:13:34 发布