提示了解解决皇后区的精彩程序 [英] Hints to understand splendid program to solve Queens

查看:13
本文介绍了提示了解解决皇后区的精彩程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在 Sterling & 的 Art of Prolog 中夏皮罗,练习第 14.1 (v) 节:

queens(N,Qs) :-长度(Qs,N),place_queens(N,Qs,_,_).place_queens(0,_Qs,_Ups,_Downs).place_queens(I,Qs,Ups,[_|Downs]) :-我>0, I1 为 I-1,place_queens(I1,Qs,[_|Ups] ,Downs),place_queen(I,Qs,Ups,Downs).place_queen(Q,[Q|_],[Q|_],[Q|_]).place_queen(Q,[_|​​Qs],[_|Ups],[_|Downs]):-place_queen(Q,Qs,Ups,Downs).

这是一个精彩的程序,11行,快速解决了棋盘上的皇后定位问题.这很神奇:只有计数器、递归和越来越短的列表.我,即使在trace的帮助下,也不明白.有人可以向我解释吗?你如何编写这样的程序?例如,从另一个(良好的标准解决方案)推导出这个程序的逻辑/心理过程是什么:

queens(N,Qs) :-数字列表(1,N,Ns),皇后(Ns,[],Qs).皇后区(未放置的Qs,SafeQs,Qs):-选择(Q,UnplacedQs,UnplacedQs1),+ 攻击(Q,SafeQs),皇后(未放置的Qs1,[Q|SafeQs],Qs).皇后([ ],Qs,Qs).攻击(X,Xs):-攻击(X,1,Xs).攻击(X,N,[Y|_]):-X 是 Y+N ;X是Y-N.攻击(X,N,[_|Ys]):-N1 是 N+1,攻击(X,N1,Ys).

解决方案

问题第一部分的代码就是这里解释的内容.代码在这里重新发布,以确保读者不会误看错误代码.

queens(N,Qs) :-长度(Qs,N),place_queens(N,Qs,_,_).place_queens(0,_Qs,_Ups,_Downs).place_queens(I,Qs,Ups,[_|Downs]) :-我>0, I1 为 I-1,place_queens(I1,Qs,[_|Ups] ,Downs),place_queen(I,Qs,Ups,Downs).place_queen(Q,[Q|_],[Q|_],[Q|_]).place_queen(Q,[_|​​Qs],[_|Ups],[_|Downs]):-place_queen(Q,Qs,Ups,Downs).

此代码是大多数 Prolog 对 N-Queens 问题的解决方案的生成和测试.该代码生成一个可能的解决方案并对其进行测试.然而,不是一次为一个可能的答案生成所有位置,而是逐步设置皇后位置并在部分失败时更改,直到找到完整的解决方案.

代码中有一个笔试

place_queen(Q,[Q|_],[Q|_],[Q|_]).

要理解这一点,需要了解

注意:使用国际象棋图设置

生成的图像

向上的对角线长度为二,向下的对角线长度为一.

测试说明的是,如果第一个参数中给出的皇后可以与列攻击参数统一,则向上对角线攻击和向下对角线攻击然后接受该位置的皇后以获得部分答案或完整如果皇后在第二个参数中的列表的最后一个位置,则回答.

所以为了测试

place_queen(Q,[Q|_],[Q|_],[Q|_]).

为了清楚起见和文档,与本文相同

place_queen(Q,Rs,Ups,Downs) :-Rs = [R_1|_],上升 = [U_1|_],唐斯 = [D_1|_],Q = R_1,Q = U_1,Q = D_1

那么如果

Q 是 1
R_1 未绑定
U_1 未绑定
D_1 未绑定

过去的测试和 1 绑定到变量 R_1、U_1 和 D_1.

以及失败的测试示例

Q 是 3
R_1 为 1
U_1 未绑定
D_1 未绑定

现在是由于列表中没有值而作为测试失败的调用.

Q 是 2
R_1 是 []
U_1 未绑定
D_1 未绑定

其余代码只是生成测试用例.

可以看到第二个参数是通过运行此代码变体生成的.

queens(N) :-长度(Qs,N),格式(N:~w,Qs:~w~n",[N,Qs]).?-皇后(4).N: 4, Qs: [_6476,_6482,_6488,_6494]真的.

可以看到通过运行此代码变体生成对角线参数.

queens(N) :-长度(Qs,N),place_queens(N,Qs,_,_).place_queens(0,_Qs,_Ups,_Downs).place_queens(I,Qs,Ups,[_|Downs]) :-我>0,I1 是 I-1,place_queens(I1,Qs,[_|Ups] ,Downs),格式('I1:~w,Qs:~w,Ups:~w,Downs:~w~n',[I1,Qs,Ups,Downs]).?-皇后(4).I1:0,Qs:[_6474,_6480,_6486,_6492],上升:[_6528,_6516,_6504|_6506],下降:_6536I1:1,Qs:[_6474,_6480,_6486,_6492],上升:[_6516,_6504|_6506],下降:[_6534|_6536]I1:2,Qs:[_6474,_6480,_6486,_6492],上升:[_6504|_6506],下降:[_6522,_6534|_6536]I1:3,Qs:[_6474,_6480,_6486,_6492],上升:_6506,下降:[_6510,_6522,_6534|_6536]真的 ;错误的.

这小部分

place_queen(Q,[_|​​Rs],[_|Ups],[_|Downs]):-place_queen(Q,Rs,Ups,Downs).

只是说如果下一个皇后的位置不适用于列中的一行,则选择另一行.请注意,上面的示例将第二个参数的变量名称从 Qs 更改为 Rs 以表示正在更改的是行.

为了更容易看到实际的生成和测试,请修改代码

queens(N,Qs) :-长度(Qs,N),place_queens(N,Qs,_,_).place_queens(0,_Qs,_Ups,_Downs).place_queens(I,Qs,Ups,[_|Downs]) :-我>0,I1 是 I-1,place_queens(I1,Qs,[_|Ups] ,Downs),format('生成 1 - I: ~w, Qs: ~w, Ups: ~w, Downs: ~w~n',[I,Qs,Ups,Downs]),place_queen(I,Qs,Ups,Downs),格式('结果 -> I:~w,Qs:~w,Ups:~w,Downs:~w~n',[I,Qs,Ups,Downs]).place_queen(Q,Rs,Ups,Downs) :-Rs = [R_1|_],上升 = [U_1|_],唐斯 = [D_1|_],format('测试 - Q : ~w, R_1: ~w, U_1: ~w, D_1: ~w~n',[Q,R_1,U_1,D_1]),(Rs = [Q|_],上升 = [Q|_],唐斯 = [Q|_]->format('测试成功~n');format('测试失败~n'),失败).place_queen(Q,[_|​​Qs],[_|Ups],[_|Downs]):-format('生成 2 - Q: ~w, Qs: ~w, Ups: ~w, Downs: ~w~n',[Q,Qs,Ups,Downs]),place_queen(Q,Qs,Ups,Downs).

第一个解决方案的示例.

?-queens(4,Qs).生成 1 - I: 1, Qs: [_6488,_6494,_6500,_6506], Ups: [_6542,_6530,_6518|_6520], Downs: _6550测试 - Q:1,Q_1:_6488,U_1:_6542,D_1:_6596测试成功结果->I: 1, Qs: [1,_6494,_6500,_6506], Ups: [1,_6530,_6518|_6520], Downs: [1|_6598]生成 1 - I: 2, Qs: [1,_6494,_6500,_6506], Ups: [_6530,_6518|_6520], Downs: [_6548,1|_6598]测试 - Q:2,Q_1:1,U_1:_6530,D_1:_6548测试失败生成 2 - Q:2,Qs:[_6494,_6500,_6506],Ups:[_6518|_6520],Downs:[1|_6598]测试 - Q:2,Q_1:_6494,U_1:_6518,D_1:1测试失败生成 2 - Q: 2, Qs: [_6500,_6506], Ups: _6520, Downs: _6598测试 - Q:2,Q_1:_6500,U_1:_6746,D_1:_6752测试成功结果->I:2,Q:[1,_6494,2,_6506],上升:[_6530,_6518,2|_6748],下降:[_6548,1,2|_6754]生成 1 - I: 3, Qs: [1,_6494,2,_6506], Ups: [_6518,2|_6748], Downs: [_6536,_6548,1,2|_6754]测试 - Q:3,Q_1:1,U_1:_6518,D_1:_6536测试失败生成 2 - Q:3,Qs:[_6494,2,_6506],Ups:[2|_6748],Downs:[_6548,1,2|_6754]测试 - Q:3,Q_1:_6494,U_1:2,D_1:_6548测试失败生成 2 - Q:3,Qs:[2,_6506],Ups:_6748,Downs:[1,2|_6754]测试 - Q:3,Q_1:2,U_1:_6902,D_1:1测试失败生成 2 - Q:3,Qs:[_6506],Ups:_6898,Downs:[2|_6754]测试 - Q:3,Q_1:_6506,U_1:_6932,D_1:2测试失败生成 2 - Q: 3, Qs: [], Ups: _6928, Downs: _6754生成 2 - Q:2,Qs:[_6506],Ups:_6742,Downs:_6748测试 - Q:2,Q_1:_6506,U_1:_6782,D_1:_6788测试成功结果->I:2,Q:[1,_6494,_6500,2],上升:[_6530,_6518,_6740,2|_6784],下降:[_6548,1,_6746,2|_6790]生成 1 - I: 3, Qs: [1,_6494,_6500,2], Ups: [_6518,_6740,2|_6784], Downs: [_6536,_6548,1,_6746,2|_6790]测试 - Q:3,Q_1:1,U_1:_6518,D_1:_6536测试失败生成 2 - Q: 3, Qs: [_6494,_6500,2], Ups: [_6740,2|_6784], Downs: [_6548,1,_6746,2|_6790]测试 - Q:3,Q_1:_6494,U_1:_6740,D_1:_6548测试成功结果->I: 3, Qs: [1,3,_6500,2], Ups: [_6518,3,2|_6784], Downs: [_6536,3,1,_6746,2|_6790]生成 1 - I:4,Qs:[1,3,_6500,2],Ups:[3,2|_6784],Downs:[_6524,_6536,3,1,_6746,2|_6790]测试 - Q:4,Q_1:1,U_1:3,D_1:_6524测试失败生成 2 - Q: 4, Qs: [3,_6500,2], Ups: [2|_6784], Downs: [_6536,3,1,_6746,2|_6790]测试 - Q:4,Q_1:3,U_1:2,D_1:_6536测试失败生成 2 - Q: 4, Qs: [_6500,2], Ups: _6784, Downs: [3,1,_6746,2|_6790]测试 - Q:4,Q_1:_6500,U_1:_7070,D_1:3测试失败生成 2 - Q: 4, Qs: [2], Ups: _7066, Downs: [1,_6746,2|_6790]测试 - Q:4,Q_1:2,U_1:_7100,D_1:1测试失败生成 2 - Q: 4, Qs: [], Ups: _7096, Downs: [_6746,2|_6790]生成 2 - Q: 3, Qs: [_6500,2], Ups: [2|_6784], Downs: [1,_6746,2|_6790]测试 - Q:3,Q_1:_6500,U_1:2,D_1:1测试失败生成 2 - Q:3,Qs:[2],Ups:_6784,Downs:[_6746,2|_6790]测试 - Q:3,Q_1:2,U_1:_6962,D_1:_6746测试失败生成 2 - Q:3,Qs:[],Ups:_6958,Downs:[2|_6790]生成 2 - Q: 2, Qs: [], Ups: _6778, Downs: _6784生成 2 - Q: 1, Qs: [_6494,_6500,_6506], Ups: [_6530,_6518|_6520], Downs: _6586测试 - Q:1,Q_1:_6494,U_1:_6530,D_1:_6626测试成功结果->I:1,Qs:[_6488,1,_6500,_6506],Ups:[_6542,1,_6518|_6520],Downs:[_6584,1|_6628]生成 1 - I:2,Qs:[_6488,1,_6500,_6506],Ups:[1,_6518|_6520],Downs:[_6548,_6584,1|_6628]测试 - Q:2,Q_1:_6488,U_1:1,D_1:_6548测试失败生成 2 - Q:2,Qs:[1,_6500,_6506],Ups:[_6518|_6520],Downs:[_6584,1|_6628]测试 - Q:2,Q_1:1,U_1:_6518,D_1:_6584测试失败生成 2 - Q: 2, Qs: [_6500,_6506], Ups: _6520, Downs: [1|_6628]测试 - Q:2,Q_1:_6500,U_1:_6776,D_1:1测试失败生成 2 - Q:2,Qs:[_6506],Ups:_6772,Downs:_6628测试 - Q:2,Q_1:_6506,U_1:_6806,D_1:_6812测试成功结果->I:2,Q:[_6488,1,_6500,2],上升:[1,_6518,_6770,2|_6808],下降:[_6548,_6584,1,2|_6814]生成 1 - I:3,Qs:[_6488,1,_6500,2],Ups:[_6518,_6770,2|_6808],Downs:[_6536,_6548,_6584,1,2|_6814]测试 - Q:3,Q_1:_6488,U_1:_6518,D_1:_6536测试成功结果->I: 3, Qs: [3,1,_6500,2], Ups: [3,_6770,2|_6808], Downs: [3,_6548,_6584,1,2|_6814]生成 1 - I: 4, Qs: [3,1,_6500,2], Ups: [_6770,2|_6808], Downs: [_6524,3,_6548,_6584,1,2|_6814]测试 - Q:4,Q_1:3,U_1:_6770,D_1:_6524测试失败生成 2 - Q: 4, Qs: [1,_6500,2], Ups: [2|_6808], Downs: [3,_6548,_6584,1,2|_6814]测试 - Q:4,Q_1:1,U_1:2,D_1:3测试失败生成 2 - Q: 4, Qs: [_6500,2], Ups: _6808, Downs: [_6548,_6584,1,2|_6814]测试 - Q:4,Q_1:_6500,U_1:_7070,D_1:_6548测试成功结果->I: 4, Qs: [3,1,4,2], Ups: [_6770,2,4|_7072], Downs: [_6524,3,4,_6584,1,2|_6814]Qs = [3, 1, 4, 2] .

如果您发现这里的输出很难阅读,因为它太宽并且难以作为顶级输出(swipl.exe)查看,那么看看如何使用 protocol/1 将输出捕获到文件以供查看和分析.

In Art of Prolog of Sterling & Shapiro, exercise Section 14.1 (v):

queens(N,Qs) :-
    length(Qs,N),
    place_queens(N,Qs,_,_).

place_queens(0,_Qs,_Ups,_Downs).
place_queens(I,Qs,Ups,[_|Downs]) :-
    I > 0, I1 is I-1,
    place_queens(I1,Qs,[_|Ups] ,Downs),
    place_queen(I,Qs,Ups,Downs).

place_queen(Q,[Q|_],[Q|_],[Q|_]).
place_queen(Q,[_|Qs],[_|Ups],[_|Downs] ):-
    place_queen(Q,Qs,Ups,Downs).

It is a splendid program, in 11 lines, which quickly solves the problem of positioning queens on a chessboard. It's magical: there is only a counter, recursion, and lists that get longer and shorter. I, even with the help of trace, don't understand it. Can someone explain it to me? How do you get to write such a program? What is the logical / mental process that leads to derive this program from, for example, this other (good standard solution):

queens(N,Qs) :-
    numlist(1,N,Ns), 
    queens(Ns,[ ],Qs).

queens(UnplacedQs,SafeQs,Qs) :-
    select(Q,UnplacedQs,UnplacedQs1),
    + attack(Q,SafeQs),
    queens(UnplacedQs1,[Q|SafeQs] ,Qs).
queens([ ],Qs,Qs).

attack(X,Xs) :-
    attack(X,1,Xs).

attack(X,N,[Y|_]) :-
    X is Y+N ; X is Y-N.
attack(X,N,[_|Ys]) :-
    N1 is N+1,
    attack(X,N1,Ys).

解决方案

The code in the first part of the question is what is explained here. The code is reposted here to ensure a reader doesn't mistakenly look at the wrong code.

queens(N,Qs) :-
    length(Qs,N),
    place_queens(N,Qs,_,_).

place_queens(0,_Qs,_Ups,_Downs).
place_queens(I,Qs,Ups,[_|Downs]) :-
    I > 0, I1 is I-1,
    place_queens(I1,Qs,[_|Ups] ,Downs),
    place_queen(I,Qs,Ups,Downs).

place_queen(Q,[Q|_],[Q|_],[Q|_]).
place_queen(Q,[_|Qs],[_|Ups],[_|Downs] ):-
    place_queen(Q,Qs,Ups,Downs).

This code as is most Prolog solutions to the N-Queens problem a generate and test. The code generates a possible solution and test it. However instead of generating all positions for one possible answer at once, the queen positions are set incrementally and changed upon a partial failure until a complete solution is found.

There is one written test in the code which is

place_queen(Q,[Q|_],[Q|_],[Q|_]).

To understand this requires understanding what the meaning of the arguments as related to this statement from here

Now imagine that the chess-board is divided into three layers, one that deals with attacks on columns and two for the diagonals going up and down respectively.

The first argument represents a queen identified by a positive integer and which is bound.

The second argument represents a column and is always a list the size of the board where each potion in the list represents one of the columns of the board. The code uses the variable Qs for but to me it makes more sense as Rs, meaning rows. So if there is any bound value in a position in the list that would be a queen attacking in that column.

The third and fourth arguments work in principal in the same way and take care of the diagonal attack for the queen. One is for the diagonals going up and one the diagonals going down. Since they are diagonals again they are represented as list but depending upon the potion of a queen on the board that is being checked, the size of the diagonal going up may be different than the size of the diagonal going down.

For example in the image below the white queen represents the position of a queen being checked and the black queens going diagonally up represent the up going diagonal list and the other queen represents the down going diagonal list.

Note: Images generated using Chess Diagram Setup

The going up diagonal is length of two while the going down diagonal is length of one.

What the test states is that if a queen given in the first argument can be unified with the column attack argument, the going up diagonal attack and the going down diagonal attack then accept the queen in that position for a partial answer or complete answer if the queen is in the last position of the list in the second argument.

So for the test

place_queen(Q,[Q|_],[Q|_],[Q|_]).

which is the same as this written for clarity and documentation

place_queen(Q,Rs,Ups,Downs) :-
  Rs = [R_1|_],
  Ups = [U_1|_],
  Downs = [D_1|_],
  Q = R_1, Q = U_1, Q = D_1

then if

Q is 1
R_1 is unbound
U_1 is unbound
D_1 is unbound

The test past and 1 is bound to the variables R_1, U_1, and D_1.

and an example of a test that fails

Q is 3
R_1 is 1
U_1 is unbound
D_1 is unbound

Now for a call that fails as a test because of no value in the list.

Q is 2
R_1 is []
U_1 is unbound
D_1 is unbound

The rest of the code just generates cases for testing.

The second argument can be seen being generated by running this variation of the code.

queens(N) :-
    length(Qs,N),
    format("N: ~w, Qs: ~w~n",[N,Qs]).

?- queens(4).
N: 4, Qs: [_6476,_6482,_6488,_6494]
true.

The diagonal arguments can be seen being generated by running this variation of the code.

queens(N) :-
    length(Qs,N),
    place_queens(N,Qs,_,_).

place_queens(0,_Qs,_Ups,_Downs).
place_queens(I,Qs,Ups,[_|Downs]) :-
    I > 0,
    I1 is I-1,
    place_queens(I1,Qs,[_|Ups] ,Downs),
    format('I1: ~w, Qs: ~w, Ups: ~w, Downs: ~w~n',[I1,Qs,Ups,Downs]).

?- queens(4).
I1: 0, Qs: [_6474,_6480,_6486,_6492], Ups: [_6528,_6516,_6504|_6506], Downs: _6536
I1: 1, Qs: [_6474,_6480,_6486,_6492], Ups: [_6516,_6504|_6506], Downs: [_6534|_6536]
I1: 2, Qs: [_6474,_6480,_6486,_6492], Ups: [_6504|_6506], Downs: [_6522,_6534|_6536]
I1: 3, Qs: [_6474,_6480,_6486,_6492], Ups: _6506, Downs: [_6510,_6522,_6534|_6536]
true ;
false.

This small part

place_queen(Q,[_|Rs],[_|Ups],[_|Downs] ):-
    place_queen(Q,Rs,Ups,Downs).

just says that if the position for the next queen did not work for a row in the column, then pick another row. Note that the example of above change the variable name of the second argument from Qs to Rs to say that it is row that is being changed.

To make it easier to see the generate and test in action, modify the code as such

queens(N,Qs) :-
    length(Qs,N),
    place_queens(N,Qs,_,_).

place_queens(0,_Qs,_Ups,_Downs).
place_queens(I,Qs,Ups,[_|Downs]) :-
    I > 0,
    I1 is I-1,
    place_queens(I1,Qs,[_|Ups] ,Downs),
    format('Generate 1 - I: ~w, Qs: ~w, Ups: ~w, Downs: ~w~n',[I,Qs,Ups,Downs]),
    place_queen(I,Qs,Ups,Downs),
    format('Result    -> I: ~w, Qs: ~w, Ups: ~w, Downs: ~w~n',[I,Qs,Ups,Downs]).

place_queen(Q,Rs,Ups,Downs) :-
    Rs = [R_1|_],
    Ups = [U_1|_],
    Downs = [D_1|_],
    format('Test        - Q : ~w, R_1: ~w, U_1: ~w, D_1: ~w~n',[Q,R_1,U_1,D_1]),
    (
        Rs = [Q|_],
        Ups = [Q|_],
        Downs = [Q|_]
    ->
        format('Test success~n')
    ;
        format('Test failure~n'),
        fail
    ).

place_queen(Q,[_|Qs],[_|Ups],[_|Downs] ):-
    format('Generate 2 - Q: ~w, Qs: ~w, Ups: ~w, Downs: ~w~n',[Q,Qs,Ups,Downs]),
    place_queen(Q,Qs,Ups,Downs).

An example run up to the first solution.

?- queens(4,Qs).
Generate 1 - I: 1, Qs: [_6488,_6494,_6500,_6506], Ups: [_6542,_6530,_6518|_6520], Downs: _6550
Test        - Q : 1, Q_1: _6488, U_1: _6542, D_1: _6596
Test success
Result    -> I: 1, Qs: [1,_6494,_6500,_6506], Ups: [1,_6530,_6518|_6520], Downs: [1|_6598]
Generate 1 - I: 2, Qs: [1,_6494,_6500,_6506], Ups: [_6530,_6518|_6520], Downs: [_6548,1|_6598]
Test        - Q : 2, Q_1: 1, U_1: _6530, D_1: _6548
Test failure
Generate 2 - Q: 2, Qs: [_6494,_6500,_6506], Ups: [_6518|_6520], Downs: [1|_6598]
Test        - Q : 2, Q_1: _6494, U_1: _6518, D_1: 1
Test failure
Generate 2 - Q: 2, Qs: [_6500,_6506], Ups: _6520, Downs: _6598
Test        - Q : 2, Q_1: _6500, U_1: _6746, D_1: _6752
Test success
Result    -> I: 2, Qs: [1,_6494,2,_6506], Ups: [_6530,_6518,2|_6748], Downs: [_6548,1,2|_6754]
Generate 1 - I: 3, Qs: [1,_6494,2,_6506], Ups: [_6518,2|_6748], Downs: [_6536,_6548,1,2|_6754]
Test        - Q : 3, Q_1: 1, U_1: _6518, D_1: _6536
Test failure
Generate 2 - Q: 3, Qs: [_6494,2,_6506], Ups: [2|_6748], Downs: [_6548,1,2|_6754]
Test        - Q : 3, Q_1: _6494, U_1: 2, D_1: _6548
Test failure
Generate 2 - Q: 3, Qs: [2,_6506], Ups: _6748, Downs: [1,2|_6754]
Test        - Q : 3, Q_1: 2, U_1: _6902, D_1: 1
Test failure
Generate 2 - Q: 3, Qs: [_6506], Ups: _6898, Downs: [2|_6754]
Test        - Q : 3, Q_1: _6506, U_1: _6932, D_1: 2
Test failure
Generate 2 - Q: 3, Qs: [], Ups: _6928, Downs: _6754
Generate 2 - Q: 2, Qs: [_6506], Ups: _6742, Downs: _6748
Test        - Q : 2, Q_1: _6506, U_1: _6782, D_1: _6788
Test success
Result    -> I: 2, Qs: [1,_6494,_6500,2], Ups: [_6530,_6518,_6740,2|_6784], Downs: [_6548,1,_6746,2|_6790]
Generate 1 - I: 3, Qs: [1,_6494,_6500,2], Ups: [_6518,_6740,2|_6784], Downs: [_6536,_6548,1,_6746,2|_6790]
Test        - Q : 3, Q_1: 1, U_1: _6518, D_1: _6536
Test failure
Generate 2 - Q: 3, Qs: [_6494,_6500,2], Ups: [_6740,2|_6784], Downs: [_6548,1,_6746,2|_6790]
Test        - Q : 3, Q_1: _6494, U_1: _6740, D_1: _6548
Test success
Result    -> I: 3, Qs: [1,3,_6500,2], Ups: [_6518,3,2|_6784], Downs: [_6536,3,1,_6746,2|_6790]
Generate 1 - I: 4, Qs: [1,3,_6500,2], Ups: [3,2|_6784], Downs: [_6524,_6536,3,1,_6746,2|_6790]
Test        - Q : 4, Q_1: 1, U_1: 3, D_1: _6524
Test failure
Generate 2 - Q: 4, Qs: [3,_6500,2], Ups: [2|_6784], Downs: [_6536,3,1,_6746,2|_6790]
Test        - Q : 4, Q_1: 3, U_1: 2, D_1: _6536
Test failure
Generate 2 - Q: 4, Qs: [_6500,2], Ups: _6784, Downs: [3,1,_6746,2|_6790]
Test        - Q : 4, Q_1: _6500, U_1: _7070, D_1: 3
Test failure
Generate 2 - Q: 4, Qs: [2], Ups: _7066, Downs: [1,_6746,2|_6790]
Test        - Q : 4, Q_1: 2, U_1: _7100, D_1: 1
Test failure
Generate 2 - Q: 4, Qs: [], Ups: _7096, Downs: [_6746,2|_6790]
Generate 2 - Q: 3, Qs: [_6500,2], Ups: [2|_6784], Downs: [1,_6746,2|_6790]
Test        - Q : 3, Q_1: _6500, U_1: 2, D_1: 1
Test failure
Generate 2 - Q: 3, Qs: [2], Ups: _6784, Downs: [_6746,2|_6790]
Test        - Q : 3, Q_1: 2, U_1: _6962, D_1: _6746
Test failure
Generate 2 - Q: 3, Qs: [], Ups: _6958, Downs: [2|_6790]
Generate 2 - Q: 2, Qs: [], Ups: _6778, Downs: _6784
Generate 2 - Q: 1, Qs: [_6494,_6500,_6506], Ups: [_6530,_6518|_6520], Downs: _6586
Test        - Q : 1, Q_1: _6494, U_1: _6530, D_1: _6626
Test success
Result    -> I: 1, Qs: [_6488,1,_6500,_6506], Ups: [_6542,1,_6518|_6520], Downs: [_6584,1|_6628]
Generate 1 - I: 2, Qs: [_6488,1,_6500,_6506], Ups: [1,_6518|_6520], Downs: [_6548,_6584,1|_6628]
Test        - Q : 2, Q_1: _6488, U_1: 1, D_1: _6548
Test failure
Generate 2 - Q: 2, Qs: [1,_6500,_6506], Ups: [_6518|_6520], Downs: [_6584,1|_6628]
Test        - Q : 2, Q_1: 1, U_1: _6518, D_1: _6584
Test failure
Generate 2 - Q: 2, Qs: [_6500,_6506], Ups: _6520, Downs: [1|_6628]
Test        - Q : 2, Q_1: _6500, U_1: _6776, D_1: 1
Test failure
Generate 2 - Q: 2, Qs: [_6506], Ups: _6772, Downs: _6628
Test        - Q : 2, Q_1: _6506, U_1: _6806, D_1: _6812
Test success
Result    -> I: 2, Qs: [_6488,1,_6500,2], Ups: [1,_6518,_6770,2|_6808], Downs: [_6548,_6584,1,2|_6814]
Generate 1 - I: 3, Qs: [_6488,1,_6500,2], Ups: [_6518,_6770,2|_6808], Downs: [_6536,_6548,_6584,1,2|_6814]
Test        - Q : 3, Q_1: _6488, U_1: _6518, D_1: _6536
Test success
Result    -> I: 3, Qs: [3,1,_6500,2], Ups: [3,_6770,2|_6808], Downs: [3,_6548,_6584,1,2|_6814]
Generate 1 - I: 4, Qs: [3,1,_6500,2], Ups: [_6770,2|_6808], Downs: [_6524,3,_6548,_6584,1,2|_6814]
Test        - Q : 4, Q_1: 3, U_1: _6770, D_1: _6524
Test failure
Generate 2 - Q: 4, Qs: [1,_6500,2], Ups: [2|_6808], Downs: [3,_6548,_6584,1,2|_6814]
Test        - Q : 4, Q_1: 1, U_1: 2, D_1: 3
Test failure
Generate 2 - Q: 4, Qs: [_6500,2], Ups: _6808, Downs: [_6548,_6584,1,2|_6814]
Test        - Q : 4, Q_1: _6500, U_1: _7070, D_1: _6548
Test success
Result    -> I: 4, Qs: [3,1,4,2], Ups: [_6770,2,4|_7072], Downs: [_6524,3,4,_6584,1,2|_6814]
Qs = [3, 1, 4, 2] .

If you find it hard to read this output here because it is to wide and also hard to view as output to the top level (swipl.exe), then see how to use protocol/1 to capture the output to file for viewing and analysis.

这篇关于提示了解解决皇后区的精彩程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆