2017-01-17 1 views
0

NQueens問題の再帰プログラムを、指定されたボードサイズで作成しています。私の問題は、女王はボードに置かれていないと私はなぜわからないです。私はプログラムをトレースしようとしましたが、私はまだ私の問題を見ていません。助言がありますか?NQueensパズル、女王は置いていない?

public class Main { 


public static boolean[][] board; 

public static void main(String[] args) throws FileNotFoundException { 

    Scanner scan = new Scanner(System.in); 
    System.out.println("Enter size of board"); 
    int n = scan.nextInt(); 
    board = new boolean[n][n]; 

    for (int i = 0; i < board.length; i++) { 
     for (int j = 0; j < board[0].length; j++) { 

      board[i][j] = false; 
     } 
    } 

    NQueens(0); 
    printBoard(); 
    for (int i = 0; i < board.length; i++) { 
     for (int j = 0; j < board.length; j++) { 

      if (board[i][j] == true) { 

       System.out.println((i + 1) + " " + (j + 1)); 

      } 
     } 
    } 
} 

static boolean NQueens(int col) { 
    if (col >= board.length) 
     return true; 

    for (int i = 0; i < board.length; i++) { 
     if (checkNotBlocked(col, i)) { 
      board[col][i] = true; 
      if (NQueens(col + 1)) 
       return true; 

      board[col][i] = false; 
     } 
    } 
    return false; 
} 

static boolean checkNotBlocked(int col, int row) { 

    for (int i = 0; i < col; i++) { 
     if (board[i][row] == true) 
      return false; 
    } 

    for (int i = col; i >= 0; i--) { 
     for (int j = row; j >= 0; j--) { 
      if (board[i][j] == true) 
       return false; 
     } 
    } 
    for (int i = col; i >= 0; i--) { 
     for (int j = row; j < board.length; j++) { 

      if (board[i][j] == true) 
       return false; 
     } 
    } 

    return true; 
} 


static void printBoard() { 
    int i; 
    for (i = 0; i < board.length; i++) { 
     for (int j = 0; j < board.length; j++) { 
      if (board[i][j] == true) { 
       System.out.print("Q\t"); 
      } else { 
       System.out.print("_\t"); 
      } 
     } 
      System.out.println("\n"); 
    } 
} 
+0

ベスト・ベット:デバッガを使ってプログラムを実行し、実行中の動作を確認します。 –

+0

これは本当に答えていないようです –

答えて

0

対角線のチェックが正しくありません。ネストされたループを使用しました。つまり、四角形の対角線だけでなく、四角形全体をチェックしています。 に女王がいて、境界ボックス内の他の行がの場合、次の女王の配置を拒否します。これは最初のクイーンが置かれた後に起こるので、2度目のクイーンを決してボードに置くことはありません。

注意あなたが持っているものから、論理の違い:

for (int i = col; i >= 0; i--) { 
    for (int j = row; j >= 0; j--) { 
     if (board[i][j] == true) 
      return false; 
    } 
} 

...すべてをチェック対... [0] [0]までの[COL] [列]からペアを命じた反復します対角線のみ:

for (int i = col, j = row; // My apologies if this isn't legal Java; 
    i >= 0 & j >= 0;  // I'm out of practice. 
    i--, j--) {    // i and j must decrement *together*. 

    if (board[i][j]) 
      return false; 
    } 
} 

反対の対角線についても同様です。

+0

オハイ私は参照してください。私は、両方の変数が同時に増減するようなように使用される 'for'ループは見たことがありません。私は少しプログラミングに新しいです:)助けてくれてありがとう! – NoviceProgrammer123

+0

待ち!あなたは私の再帰関数の再帰呼び出しの下で "本当の真偽"が必要な理由を本当に速く説明できると思いますか?この部分:for(int i = 0; i NoviceProgrammer123

+0

助けになるのはうれしいです。私が言ったように、構文をチェックしてください。私は** C **のように、Javaが複数のステートメントのループコントロールを許可するかどうかは確かではありません。そうでない場合は、** for **コマンドの外で** j **の値を手作業で維持する必要があります(ループの前に初期化し、ループの最後に減らしますが、** i ** **でテストします)。 ** for **コントロール)。 – Prune

関連する問題