转载自:https://mp.weixin.qq.com/s/Kdvo_yGFaYmw5TjNg6Bb8Q
这是计算机科学中的经典问题。目的是在棋盘上放置八个皇后不会有两个皇后互相攻击。也就是说,在同一行,同一列或同一对角线中,没有两个皇后区。我们通过允许棋盘的任意尺寸N来概括这个原始问题。
我们用数字1..N表示皇后的位置。
例如: [4,2,7,3,6,8,5,1] 表示第一列中的皇后在第4行中,第二列中的皇后在第2行中,依此类推。通过使用数字1..N的置换,我们保证没有两个皇后在同一行中。剩下要做的唯一测试是对角线测试。放置在X列和Y行上的一个女王占据两个对角线:其中一个对角线C = X - Y,从左下角到右上角,另一个对角线D = X + Y,从左上角到右下。在测试谓词中,我们跟踪Cs和Ds中已经占用的对角线。
程序文件名:p7_01.pl
版本1 是一个简单的生成和测试解。
% queens_1(N,Qs) :- Qs是N皇后问题的解
queens_1(N,Qs) :-
range(1,N,Rs),
permu(Rs,Qs),
test(Qs).
% range(A,B,L) :- L是数字A..B的列表
range(A,A,[A]).
range(A,B,[A|L]) :-
A < B,
A1 is A+1,
range(A1,B,L