菜鸟用scheme对八皇后问题的一个实现

;; ****************************************************************
;; 注释在后面 
;; 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
;; 开始还聊天着,现在终于出来了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值