N皇后问题:
这个问题指出,给定一个大小为 N 乘 N 的棋盘,找出不同的排列方式,其中 N 个皇后可以放在棋盘上而没有任何人互相威胁。
我的问题是:
程序可以在合理的时间内计算出答案的 N 的最大值是多少?或者到目前为止我们见过的最大的 N 是多少?
这是我在 CLPFD(Prolog) 中的程序:
generate([],_).
generate([H|T],N) :-
H in 1..N ,
generate(T,N).
lenlist(L,N) :-
lenlist(L,0,N).
lenlist([],N,N).
lenlist([_|T],P,N) :-
P1 is P+1,
lenlist(T,P1,N).
queens(N,L) :-
generate(L,N),lenlist(L,N),
safe(L),
!,
labeling([ffc],L).
notattack(X,Xs) :-
notattack(X,Xs,1).
notattack(X,[],N).
notattack(X,[Y|Ys],N) :-
X #\= Y,
X #\= Y - N,
X #\= Y + N,
N1 is N + 1,
notattack(X,Ys,N1).
safe([]).
safe([F|T]) :-
notattack(F,T),
safe(T).
这个程序工作得很好,但是它所花费的时间随着 N 的增加而不断增加。这是一个示例执行:
?- queens(4,L).
L = [2, 4, 1, 3] ;
L = [3, 1, 4, 2] ;
No
这意味着您将 4 个皇后放置在第 1 列的第 2 行、第 2 列的第 4 行、第 1 行在 3 中和第 3 行在 4 中。(在 4×4 棋盘中)
现在让我们看看这个程序是如何执行的(计算第一个排列所用的时间):
N=4,5.....10 在一秒钟内计算
N=11-30 需要 -1-3 秒
N=40 ..50 仍然在一分钟内计算
在 N=60 它超出了全局堆栈(搜索空间巨大)。
这是过去的作业问题。(最初的问题只是编码 N-Queens)
我也有兴趣看到其他语言的替代实现(比我的实现更好)或者如果我的算法/程序有改进的空间