2017-04-16 14 views
0

現在、入力が2D配列のサイズと2D配列の実際の値になるN Queensの問題に取り組んでいます。このコードは、他のクイーン同士が互いに攻撃していないか、そうでない場合にこの入力が有効かどうかをチェックします。その有効な場合は単にtrueを、それ以外の場合はfalseを出力します。私はコードで約95%の作業を行っていますが、2D配列を斜めに横断するのに問題があります。私は斜めにNE、NW、SE、SWを確認できるようにしたいが、私は自分のコードの範囲を超えて配列を取得し続けている。なぜ私はそれを取得し続けている私はそれを修正する方法を知りません。私はこの問題を解決する方法に関するいくつかのガイダンスを探しています。ここに私のコードです。すべての辺から斜め方向に2D配列を横切る

import java.io.*; 
import java.util.*; 
import java.text.*; 
import java.math.*; 
import java.util.regex.*; 

public class nQueensMod { 

public static int r,c; 
public static int[][]board; 

public static void main(String[] args) { 
    Scanner in = new Scanner(System.in); 
    r = in.nextInt(); 
    c = in.nextInt(); 
    board = new int[r][c]; 
    for(int board_i=0; board_i < r; board_i++){ 
     for(int board_j=0; board_j < c; board_j++){ 
      board[board_i][board_j] = in.nextInt(); 
     } 
    } 

    System.out.println(solve(board,0,0)); 
} 

    public static boolean solve(int[][]board, int row, int col) 
    { 
     if(row >= r) 
     return true; 

     if(board[row][col] == 1) 
     { 
       if(validRows(row,col) && validCols(col,row)) 
       { 
       if(move(row,col)) 
        return true; 
       } 

      /*  
       if(validRows(row,col) && validCols(col,row) && validDiagonal(row,col)) 
       { 
       if(move(row,col)) 
        return true; 
       } 
      */ 
     } 

      else 
      { 
       if(move(row,col)) 
       return true; 
      } 

     return false; 
    } 

    public static boolean validRows(int row, int col) 
    { 
     for (int i = col + 1; i < r; i++) 
     { 
     if (board[row][i] == 1) 
     { 
      return false; 
     } 
     } 

     return true; 
    } 

    public static boolean validCols(int cols, int row) 
    { 
     for (int i = row + 1; i < c; i++) 
     { 
     if (board[i][cols] == 1) 
     { 
      return false; 
     } 
     } 

     return true; 
    } 

/*  
    public static boolean validDiagonal(int row, int cols) 
    { 
     for (int i = 1; i < c; i++) 
     { 

     if (
       //checks SE 
       board[row + i][cols + i] == 1 || 
       //checks SW 
       board[row + i][cols - i] == 1 || 
       //checks NE 
       board[row - i][cols + i] == 1 || 
       //checks NW 
       board[row - i][cols - i] == 1 
      ) 

       return false; 
     } 

     return true; 
    } 
*/  
    public static boolean move(int row,int col) 
    { 
     if(col < board.length - 1) 
      return solve(board,row, col + 1); 

      else 
       return solve(board,row + 1, 0); 
    } 
} 

それは私が試したものだが、私は境界例外のうちの配列を取得しておくので、私は実際validDiagonal方法をコメントアウト。それがここに 。私は助けが必要な一部の入力

4 4 
0 1 0 0 
0 0 0 1 
1 0 0 0 
0 0 1 0 

と出力のサンプルです

True 

これは、私はこれが初めてです

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 
at nQueensMod.validDiagonal(nQueensMod.java:88) 
at nQueensMod.solve(nQueensMod.java:40) 
at nQueensMod.move(nQueensMod.java:108) 
at nQueensMod.solve(nQueensMod.java:50) 
at nQueensMod.main(nQueensMod.java:23) 

を取得エラーですここに投稿するので、質問を正しい方法で投稿していただきたいと思います。事前にみんなありがとう!

+0

デバッガでコードをステップしましたか?あなたは何を見つけましたか?あなたのポストにスタックトレースを入れなかったのはなぜですか?このサイトを効果的に使用する方法については、[help]にアクセスして[ask]をお読みください。 –

+0

@JimGarrisonはい私は自分のデバッガを使っていますが、行[0] col [1]の最初の1に当たると境界外(-1)になります。これは、ボード[行-1] [cols + 1] == 1の行が既に0になっているので、0 - 1 = -1とすると、配列外の例外であることを意味するためです。私が私の質問に述べたように、私は問題が何であるか知っています。私はそれを修正する方法についてのガイダンスが必要です。 – Rcordero

+0

申し訳ありませんが、それはStackOverflowの仕組みではありません。境界条件を処理するコードを書き直すつもりはありません。それはあなた自身に取り組む必要があります。 –

答えて

0

アレイにアクセスする前に、インデックスが範囲内にあるかどうかをチェックする必要があります。

私はIndexOutOfBoundExceptionがある理由

// for NW 
if (row-i>0 && col-i>0 && board[row - 1][cols - 1] == 1) 
    return true 

をご覧ください、あなたにヒントを与えるでしょうか?

+0

ああ!はい、わかった!ボード[row - 1] [cols - 1] == 1.のためにfalseを返すでしょう。最初に範囲外だったかどうかを実際にチェックする方法はわかりませんでしたが、これは理にかなっています!ありがとう! – Rcordero

+0

これは、任意のインデックスへのアクセスになります。アクセスを行う前に、インデックスが範囲内にあるかどうかを確認してください。 – abhipil

+0

私はあなたの助けに感謝します。私はそれのためにすべての小切手を調整することができました、そして今私のプログラムは魅力のように走ります。再度、感謝します! – Rcordero

関連する問題