我需要解决Wolfram
中提到的N个女王的变体当N = 2或N = 3时,皇后的最大数量为N-1个皇后,否则为N,因此我需要帮助在Prolog中实现N <4。
例如,对于N = 2:
?nqueens(2,Result).
Result = [2,empty]
Result = [empty,1]
Result = [empty,2]
Result = [1,empty]
表示2 * 2表中有4种可能的配置。结果列表中的数字表示行,位置表示列。
对于N = 3:
?nqueens(3,Result).
Result = [1,3, empty]
Result = [1,empty,2]
Result = [3,1,empty]
Result = [empty,1,3]
Result = [2,empty,1]
Result = [empty,3,1]
Result = [2,empty,3]
Result = [3,empty,2]
3 * 3表中有8种可能的配置。
Here是解决N皇后问题(对于N> = 4)的标准解决方案,当N <4时不起作用,这就是我的问题。
任何帮助表示赞赏。
已编辑(可能的解决方案) 首先我会生成所有组合,因为N = 2会像这样:
permutInListN(List,N,Result) :- comb(N,List,Comb),permutation(Comb,Result).
comb(0,_,[]).
comb(N,[X|T],[X|Comb]) :-N>0,N1 is N-1,comb(N1,T,Comb).
comb(N,[_|T],Comb) :-N>0,comb(N,T,Comb).
?permutInListN([1,2,vacio],2,L).
%output
L = [1, 2]
L = [2, 1]
L = [1, empty]
L = [empty, 1]
L = [2, empty]
L = [empty, 2]
丢弃listResul,其中no包含空值,因为当N = 2时,可能的女王/王后为N-1(仅1个女王/王后),该谓词使用member和setoff ..(很小),并且为此的解决方案:< / p>
%output solution
L = [1, empty]
L = [empty, 1]
L = [2, empty]
L = [empty, 2]
现在,对于N = 3,即点,对于N = 3的所有ListResult:
?permutInListN([1,2,3,empty],3,L).
%output
L = [1, 2, 3]
L = [1, 3, 2]
L = [2, 1, 3]
L = [2, 3, 1]
L = [3, 1, 2]
L = [3, 2, 1]
L = [1, 2, empty]
L = [1, empty, 2]
L = [2, 1, empty]
L = [2, empty, 1]
L = [empty, 1, 2]
L = [empty, 2, 1]
L = [1, 3, empty]
L = [1, empty, 3]
L = [3, 1, empty]
L = [3, empty, 1]
L = [empty, 1, 3]
L = [empty, 3, 1]
L = [2, 3, empty]
L = [2, empty, 3]
L = [3, 2, empty]
L = [3, empty, 2]
L = [empty, 2, 3]
L = [empty, 3, 2]
丢弃listResul,其中no包含空,输出中仅8个针对彼此不互相攻击的皇后的配置有效:
%output
L = [1, 2, empty]
L = [1, empty, 2]
L = [2, 1, empty]
L = [2, empty, 1]
L = [empty, 1, 2]
L = [empty, 2, 1]
L = [1, 3, empty]
L = [1, empty, 3]
L = [3, 1, empty]
L = [3, empty, 1]
L = [empty, 1, 3]
L = [empty, 3, 1]
L = [2, 3, empty]
L = [2, empty, 3]
L = [3, 2, empty]
L = [3, empty, 2]
L = [empty, 2, 3]
L = [empty, 3, 2]
例如L = [1,empty,2]和L = [1,3,empty]都是有效的,我认为这是一种可能的解决方案:
当第一列是皇后,第三列是皇后时,它们之间没有一行有效 例如:L = [1,empty,2] ---> [queen(第一列,第一行),queen(第三列,第二行),_] 他们之间不行
当下一列中有一个女王/王后跟随女王/王后时,其间有一行有效 例如:L = [1,3,empty] ----> [queen(第一列,第一行),queen(第二列,第三行),_] 他们之间只是一排
它适用于8种配置,任何想法如何实现???????? 我希望我对自己的解释很好。