解决Prolog中N <4的N皇后问题的解决方案吗?

时间:2018-12-06 21:37:11

标签: prolog n-queens

我需要解决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种配置,任何想法如何实现???????? 我希望我对自己的解释很好。

0 个答案:

没有答案