问题描述
在 8 X 8 格的国际象棋棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后不能处于同一行、同一列或同一斜线上,求这八皇后有多少种摆法。该问题可推广至 N X N 的棋盘。
解决思路
按一个方向处理棋盘,每次在每一列里放一个皇后。如果现在放好 k - 1 个皇后,第 k 个皇后就必须放在不会被已在棋盘上的任何皇后攻击的位置上。
即使用分治策略处理该问题。假定我们已经生成在棋盘的前 k - 1 列放置 k - 1 个皇后的所有可能方式,对其中每种方式,都生成将下一个皇后放在第 k 列中每一行的扩充集合。而后只留下那些符合条件的解。
Scheme实现
棋盘中皇后的摆放用列表表示,列表第一个元素表示第 8 列皇后所在行。
1 | (define (accumulate op initial sequence) ; 累计工作的实现 |
打印程序运算结果
1 | (for-each (lambda (pos) |