現在、入力が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)
を取得エラーですここに投稿するので、質問を正しい方法で投稿していただきたいと思います。事前にみんなありがとう!
デバッガでコードをステップしましたか?あなたは何を見つけましたか?あなたのポストにスタックトレースを入れなかったのはなぜですか?このサイトを効果的に使用する方法については、[help]にアクセスして[ask]をお読みください。 –
@JimGarrisonはい私は自分のデバッガを使っていますが、行[0] col [1]の最初の1に当たると境界外(-1)になります。これは、ボード[行-1] [cols + 1] == 1の行が既に0になっているので、0 - 1 = -1とすると、配列外の例外であることを意味するためです。私が私の質問に述べたように、私は問題が何であるか知っています。私はそれを修正する方法についてのガイダンスが必要です。 – Rcordero
申し訳ありませんが、それはStackOverflowの仕組みではありません。境界条件を処理するコードを書き直すつもりはありません。それはあなた自身に取り組む必要があります。 –