2012-03-27 17 views
0

N-queensの問題に取り組んでいます。スタックを正しく充填するのが難しい。誰もが私に指針を与えることを望んでいた。N-Queens、LinkedList Stackを使用するJava

私の出力は異常です。ノードは7つしかありませんが、私の「成功」ブール値はそれが真であるために8つ必要です。そして、私が列を増やすので1,2と思ったとき、ヘッドノードは2,1であった。

私は対角線についても調べる必要があることを知っていますが、私は段階的にそれを取っています。

conflictCheckメソッドを使用する場合は、最初に取り組む必要があります。それは真実を返すことはありません(はい、紛争があります)。私が何かを見つけたらすぐに更新します。

Hurray 
8, 1 
7, 1 
6, 1 
5, 1 
4, 1 
3, 1 
2, 1 

編集:私はより多くの再帰的な試みのためのコードにいくつかの変更を加えました

。 私の新しい出力はこれです:

The stack 
1, 1 

End of stack 
Pushing next node 
The stack 
2, 1 
1, 1 

End of stack 
Moving over one column 
The stack 
2, 2 
1, 1 

End of stack 
problem 
Moving over one column 
The stack 
2, 3 
1, 1 

End of stack 

これは、進行中のコード/仕事の一部です。その中に(conflictCheck)

public static boolean conflictCheck() { 
    QueenNode temp = head; 
    //walk through stack and check for conflicts 

    while(temp!=null) { 
     //if there is no next node, there is no conflict with it 
     if (temp.getNext() == null){ 
      System.out.println("No next node"); 
      if (queens.size() < 8) { 
       return false; 
      } 
     } 
     else if (temp.getRow() ==temp.getNext().getRow() || temp.getColumn() == temp.getNext().getColumn() || 
       diagonal(temp, temp.getNext())){ 
      return true; 
     } 
    } 
    return false; 
} 

public static void mover(QueenNode n) { 
    System.out.println("Moving over one column"); 

     n.setColumn(n.getColumn()+1); 

    queens.viewPieces(); 
} 

public static void playChess(int k, int total) { 
    QueenNode temp= head; 
    while (temp != null) { 
     System.out.println("Pushing next node"); 

     queens.push(k,1); 
     queens.viewPieces(); 
     //success 
     if(k == 8){ 
      System.out.println("Hurray"); 
      success = true; 
      return; 
     } 
     //conflict between pieces, loops through entire board 
     while (conflictCheck()) { 
      if (head.getColumn() != 8) { 
       mover(head); 
      } 
      else { 
       queens.pop(); 
       mover(head); 
      } 
     } 

     playChess(k+1, total);     
    } 
} 

public static void main(String[] args) { 
    queens.push(1, 1); 
    queens.viewPieces(); 
    success = false; 
    playChess(2, total); 
} 

}

答えて

0

temp != null && temp.getNext()!= nullから今のところ、それは永遠のループに実行している、最も可能性が高い - 第八女王のための値temp.getNext()nullであり、それが印刷されません。変更するには、次の

while (temp != null) { 
       System.out.println(temp.getRow() + ", " + temp.getColumn()); 
       temp = temp.getNext(); 
      } 

編集

変更||コードqueens.push(queens.size()+1, 1);

if (temp.getRow() != temp.getNext().getRow() && 
       temp.getColumn() != temp.getNext().getColumn()) { 
      return false; 
     } 

あなたが常に2番目の引数として1を割り当てる:& &へ。すべての可能性をチェックする必要があります。確かに

+0

が、それらすべての競合としてマークされなければなりませんか? – jackie

+0

私はいくつかの編集を行った – jackie

+0

私はいくつかの編集を行った、私は紛争に対処する方法を把握しようとしている。競合があり、トップの列が8の場合は、それをポップアップして、次のトップの列を1だけ上に移動します。列が8でない場合は、トップの列を1だけ上に移動し、競合がないか再確認します。今、永遠のループがあります:/ – jackie

関連する問題