2016-12-07 4 views
0

8クイーンの問題を解決するために再帰的なバックトラッキングを使用するコードに取り組んでいます(n×nボードにn個のチェスクイーンを配置してお互いを攻撃しないようにします)。 (int型n)は、公共solveQueens書く方法をArray Index Out of Bounds N個のクイーンを解決する際の例外

が指定した列に女王を配置しようとする民間再帰placeQueen(board, column)方法を書くn×nのボードの問題を解決するために:

私の仕事は、2つのメソッドを作成することでした。

これまでのところ、私は私のプログラムでこれを書いた:

public class Queen { 

    public static boolean isLegal(int[] board, int n) { 
     for (int i = 0; i < n; i++) { 
      if (board[i] == board[n]) { 
       return false; 
      } 
      if ((board[i] - board[n]) == (n - i)) { 
       return false; 
      } 
      if ((board[n] - board[i]) == (n - i)) { 
       return false; 
      } 
     } 
     return true; 

    } 

    public static void solver(int n) { 
     int[] board = new int[n]; 
     PlaceQueen(board, 0); 
    } 

    private static int[] PlaceQueen(int[] board, int column) { 
     int n = board.length; 
     if (column == n); else { 
      for (int row = 0; row < n; row++) { 
       board[column] = row; 
       if (isLegal(board, column)) { 
        PlaceQueen(board, column + 1); 
       } 

      } 
     } 
     return (board); 
    } 

    public static void main(String[] args) { 
     int n = Integer.parseInt(args[0]); 
     solver(n); 
    } 
} 

私のプログラムが正常にコンパイルが、私はそれを実行しようとするたびに、私はこのエラーを取得します。

java.lang.ArrayIndexOutOfBoundsExceptionスレッドの例外 "メイン":0 Queen.mainで (Queen.java:39)

私が得るために、私のコードを編集しなければならない場所へのフィードバック上の任意の提案この例外を取り除く?

+2

java.lang.ArrayIndexOutOfBoundsExceptionを上昇しますか?プログラムの引数を渡していないようです。 –

答えて

1

あなたはプログラムに議論を提供していますか? integer引数が必要です。

public static void main(String[] args) { 
     int n = Integer.parseInt(args[0]); 
     solver(n);   
    } 

あなたがargs配列の範囲内にないインデックスにアクセスしようとする場合には、それはあなたがあなたのプログラムを実行するにはどうすればよい

+0

mainメソッドを使用してこれをテストすることをお勧めする別の方法はありますか? –

+0

クラスをどのように走らせるのですか?コマンドラインで実行した場合、プログラムの起動時に '8'の値でボード配列を評価したい場合は' java Queen 8'を実行できます。あなたのボードが常に '8'のサイズでなければならない場合は、作成時にパラメータを使うべきではありませんが、ボードをインスタンス化するときは定数を使うべきです。 – davidxxx