递归冲突Check()方法有问题。现在看来还好。我有用于测试的打印线,看起来不错。现在,当发生冲突时(返回true),我的playChess()方法应该通过调整节点的第二个变量来解决此冲突,依此类推。
我的结果从字面上是:
1,1
2,3
3,1
4,3
5,1
...
即使输出显示“哦,我们有冲突”,一旦达到x,3,它也不会对其起作用
public static boolean conflictCheck(QueenNode a, QueenNode b) {
//checks for conflicts between head and all other nodes in the stack
if (b == null) {
System.out.println("Attempting Conflict Check: Nothing to Compare to");
return false;
}
if (a.getRow()!=b.getRow() && a.getColumn()!=b.getColumn() && !diagonal(a,b)){
System.out.println("Comparing " + a.getRow() + " ," + a.getColumn() +
" And " + b.getRow() + " , " + b.getColumn());
conflictCheck(a,b.getNext());
}
else {
System.out.println("There is a conflict with " +a.getRow() + "," + a.getColumn()
+ " And " + b.getRow() + "," + b.getColumn());
return true;
}
return false;
}
public static void playChess() {
System.out.println("Playing chess");
//Either there is a conflict between head and another node, the stack isn't full, or we have solution
if (conflictCheck(head, head.getNext())) {
if (head.getColumn() == 8) {
queens.pop();
}
else if (!queens.isEmpty()) {
System.out.println("Adjusting head");
head.setColumn(head.getColumn()+1);
System.out.println("Head is now " + head.getRow() + ", " + head.getColumn());
playChess();
}
}
else if (queens.size() < 8) {
System.out.println("Stack isn't full yet");
queens.push(queens.size()+1,1);
queens.viewPieces();
playChess();
}
else {
success= true;
System.out.println("Success");
queens.viewPieces();
return;
}
}
整个输出:
The stack
1, 1
End of stack
Playing chess
Attempting Conflict Check: Nothing to Compare to
Stack isn't full yet
The stack
2, 1
1, 1
End of stack
Playing chess
There is a conflict with 2,1 And 1,1
Adjusting head
Head is now 2, 2
Playing chess
problem
There is a conflict with 2,2 And 1,1
Adjusting head
Head is now 2, 3
Playing chess
Comparing 2 ,3 And 1 , 1
Attempting Conflict Check: Nothing to Compare to
Stack isn't full yet
The stack
3, 1
2, 3
1, 1
End of stack
Playing chess
Comparing 3 ,1 And 2 , 3
There is a conflict with 3,1 And 1,1
Stack isn't full yet
The stack
4, 1
3, 1
2, 3
1, 1
End of stack
Playing chess
There is a conflict with 4,1 And 3,1
Adjusting head
Head is now 4, 2
Playing chess
problem
There is a conflict with 4,2 And 3,1
Adjusting head
Head is now 4, 3
Playing chess
Comparing 4 ,3 And 3 , 1
There is a conflict with 4,3 And 2,3
Stack isn't full yet
The stack
5, 1
4, 3
3, 1
2, 3
1, 1
End of stack
Playing chess
Comparing 5 ,1 And 4 , 3
There is a conflict with 5,1 And 3,1
Stack isn't full yet
The stack
6, 1
5, 1
4, 3
3, 1
2, 3
1, 1
End of stack
Playing chess
There is a conflict with 6,1 And 5,1
Adjusting head
Head is now 6, 2
Playing chess
problem
There is a conflict with 6,2 And 5,1
Adjusting head
Head is now 6, 3
Playing chess
Comparing 6 ,3 And 5 , 1
There is a conflict with 6,3 And 4,3
Stack isn't full yet
The stack
7, 1
6, 3
5, 1
4, 3
3, 1
2, 3
1, 1
End of stack
Playing chess
Comparing 7 ,1 And 6 , 3
There is a conflict with 7,1 And 5,1
Stack isn't full yet
The stack
8, 1
7, 1
6, 3
5, 1
4, 3
3, 1
2, 3
1, 1
End of stack
Playing chess
There is a conflict with 8,1 And 7,1
Adjusting head
Head is now 8, 2
Playing chess
problem
There is a conflict with 8,2 And 7,1
Adjusting head
Head is now 8, 3
Playing chess
Comparing 8 ,3 And 7 , 1
There is a conflict with 8,3 And 6,3
Success
The stack
8, 3
7, 1
6, 3
5, 1
4, 3
3, 1
2, 3
1, 1
End of stack
最佳答案
由于这是家庭作业,因此有一个小提示:
您不对检测到的冲突采取行动的原因很可能是因为您忽略了从conflictCheck(a,b.getNext());
递归调用的boolean conflictCheck(QueenNode a, QueenNode b)
返回值。
八个皇后的问题在第72页的this excellent work by E.W.Dijkstra中进行了深入探讨。它使用ALGOL-60(在我之前就已经过时了)编码,但是这些想法与语言无关。