您的位置:首页 > 其它

SICP 习题2.42 八皇后问题

2016-07-01 00:24 134 查看

想不到第一次写八皇后问题是用的scm

写代码的途中遇到一个错误,用let错了,用define对了,应该是编译器的原因,和nil差不多。

(define (accumulate op initial sequence)
(if (null? sequence)
initial
(op (car sequence)
(accumulate op initial (cdr sequence)))))

(define (enumerate-interval low high)
(if (> low high) '() (cons low (enumerate-interval (+ low 1) high))))

(define (fliter predicate sequence)
(cond ((null? sequence) '())
((predicate (car sequence))
(cons (car sequence) (fliter predicate (cdr sequence))))
(else (fliter predicate (cdr sequence)))))

(define (flatmap proc seq)
(accumulate append '() (map proc seq)))

(define (queens board-size)
(define (queen-cols k)
(if (= k 0)
(list empty-board)
(fliter
(lambda (positions) (safe? k positions))
(flatmap
(lambda (rest-of-queens)
(map (lambda (new-row)
(adjoin-position new-row k rest-of-queens))
(enumerate-interval 1 board-size)))
(queen-cols (- k 1))))))
(queen-cols board-size))

(define empty-board '(nil))

(define (adjoin-position new-row k rest-of-queens)
(append (list (list new-row k)) rest-of-queens))

(define (vec positions)
(define nl newline)
(nl)
(display positions)
(nl)
(display (car positions))
(nl)
(display (cadr positions)))

(define (safe? k positions)
;(if (= k 2) (vec positions))
(define (iter i Mat)
;(newline)
;(display i)
;(if (= i 2)
;  (display (cmp (car positions) (cadr Mat))))
(if (= i 1)
#t
(if (cmp (car positions) (cadr Mat))
(iter (- i 1) (cdr Mat))
#f)))
(define (cmp a1 a2)
(define x1 (car a1))
(define y1 (cadr a1))
(define x2 (car a2))
(define y2 (cadr a2))
(not (or (= x1 x2) (= y1 y2) (= (- x2 x1) (- y2 y1)) (= (- x1 x2) (- y2 y1)))))
(iter k positions))

(newline)
(display (queens 8))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  八皇后