2012-03-27 79 views
1

递归conflictCheck()方法有问题。现在看来很好。我有测试打印线,看起来不错。现在,当某些事情发生冲突(返回true)时,我的playChess()方法应该通过调整节点的第二个变量来解决冲突,依此类推。Java循环没有做它应该做的事

我的结果是字面上:

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 
+0

请显示您的完整输出。 – talnicolas 2012-03-27 16:42:41

+0

现在添加,我会编辑我原来的问题 – jackie 2012-03-27 16:43:08

回答

2

由于这是功课,有一个小提示:

您不要在冲突采取行动的理由您发现的原因很可能是因为您忽略了从boolean conflictCheck(QueenNode a, QueenNode b)递归调用的返回值conflictCheck(a,b.getNext());

第012页的this excellent work by E.W.Dijkstra深入探讨了八个女王的问题。它使用ALGOL-60编码(甚至在我的时间之前就已经过时),但这些想法与语言无关。

+0

我不明白为什么它会忽略值,虽然 – jackie 2012-03-27 16:48:58

+0

@JackieAldama返回值被忽略,因为你调用'getNext()''conflictCheck',但是当布尔值会返回给您,您的代码既不会返回它,也不会将其分配给局部变量以供进一步分析。 – dasblinkenlight 2012-03-27 16:51:29

+0

虽然打破了这种方法,但每次进行比较时,都应该打印出“比较x和y”,但只打印第一次比较的结果。我知道它是在比较堆栈中的其他人,因为我可以将它打印为“与x和z冲突”,因此它正在进行比较。这是超越布尔返回的东西,不是吗? – jackie 2012-03-27 16:54:27