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
这意味着在一个4x4的棋盘上,将4个皇后放置在第2行第1列,第4行第2列,第1行第3列和第3行第4列。(即解决N皇后问题)
现在让我们看看该程序的性能(计算第一个排列所需的时间): 对于N=4,5....10,在一秒钟内计算完成。 对于N=11-30,需要花费1-3秒钟。 对于N=40..50,仍然可以在一分钟内计算完成。 当N=60时,它会超出全局堆栈(搜索空间巨大)。
这是以前的一个作业问题。(原始问题只是编码N皇后问题)
我还想看看其他语言中的替代实现(比我的实现效果更好),或者是否有改进算法/程序的空间。
generate/2
中的事实也是错误的。 - false