SICP 2.42 “八皇后问题”及“n皇后问题”
2017-01-19 00:10
253 查看
八皇后问题:
在国际象棋棋盘(8x8)上,摆八个皇后,任意一个皇后都不能攻击另一个皇后(也就是说:任意两个皇后都不能在同一行,不能在同一列 ,不能在同一对角线)
递归地解释这个问题:假设我们已经生成了棋盘k-1列中k-1个皇后的所有可能方式,现在需
要的就是对其中每种方式,生成出将下一个皇后放在k列每一行的扩充集合。
把每次递归过程抽象为几步:(k-1)行前的皇后位置表和第k行组合成所有可能的位置表(map)—–筛选位置表(filter)—–递归调用函数
缩小规模,以三皇后问题为例,手动模拟递归,结果是无解(NULL)
Scheme代码:
adjoin_position: 给每个已经无冲突的皇后表加入k行的坐标,每个皇后的坐标是个序对(cons x y)
safe: 检查生成的所有的皇后坐标表是否无冲突
空棋盘:empty_board
在国际象棋棋盘(8x8)上,摆八个皇后,任意一个皇后都不能攻击另一个皇后(也就是说:任意两个皇后都不能在同一行,不能在同一列 ,不能在同一对角线)
递归地解释这个问题:假设我们已经生成了棋盘k-1列中k-1个皇后的所有可能方式,现在需
要的就是对其中每种方式,生成出将下一个皇后放在k列每一行的扩充集合。
把每次递归过程抽象为几步:(k-1)行前的皇后位置表和第k行组合成所有可能的位置表(map)—–筛选位置表(filter)—–递归调用函数
缩小规模,以三皇后问题为例,手动模拟递归,结果是无解(NULL)
Scheme代码:
>(define (queens board_size) (define (queen_cols k) (if (= k 0) (list empty_board) (filter (lambda (positions) (safe? k position)) (flatmap (lambda (rest_of_queens) (map (lambda (new_row) (adjoin_position new_row k rest_of_queens)) (enurmerate_interval 1 board_size)) (queen_cols (- k 1))))))) (queen_cols board_size))
adjoin_position: 给每个已经无冲突的皇后表加入k行的坐标,每个皇后的坐标是个序对(cons x y)
> (define (adjoin_position new_row k rest_of_queens) (map (lambda (x) (append (list x) rest_of_queens)) (map (lambda (n) (cons k n)) new_row)))
safe: 检查生成的所有的皇后坐标表是否无冲突
> (define (safe? k positions) (define (safe_it k y positions) (cond ((not (pair? positions)) #t) ((= k (car (car positions))) #f) ((= 1 (/ k (car (car positions))) (/ y (car (car positions)))) #f) (else (safe_it k (+ y 1) (cdr positions))))) (safe_it k 1 (cdr positions)))
空棋盘:empty_board
(define empty_board (list '()))
相关文章推荐
- sicp练习2.42 [解8皇后问题的Scheme语言实现]
- 八皇后问题及其扩展N皇后问题(经典回溯算法)
- 八皇后问题、N皇后问题回溯法详解
- C++实现 八皇后问题及其扩展N皇后问题(经典回溯算法)
- c++递归实现n皇后问题代码(八皇后问题)
- 面试题:八皇后问题(N皇后问题)
- (POJ1321) 棋盘问题 <DFS ,八皇后问题的变形,皇后数目小于等于行数即有些行可以不放>
- 八皇后问题(扩展:N皇后问题)
- SICP_Python第二章:映射(子集问题,排列问题,N皇后问题)
- 八皇后问题及n皇后问题解法及效率优化笔记(1)
- SICP 习题2.42 八皇后问题
- 【算法分析】回溯法解八皇后问题(n皇后问题)
- 【蓝桥杯-递归回溯】八皇后问题+N皇后问题
- C语言编程 N皇后问题求解
- 由八皇后问题到n皇后的推广
- 回溯法解决N皇后问题
- 8皇后问题(回溯)
- 皇后问题
- 回溯法求解8皇后问题(转帖)
- 回溯法的一个经典实例-n皇后问题