从所有边沿对角线遍历二维数组
Traversing Through a 2D Array diagonally from all sides
我目前正在研究 N Queens 问题,其中输入将是二维数组的大小和二维数组的实际值。此代码将检查此输入是否有效,因为没有任何其他皇后互相攻击,或者是否无效。如果它有效,您只需打印出 true,否则打印出 false。我的代码已完成大约 95%,但我在对角线遍历 2D 数组时遇到了问题。我希望能够沿对角线方向检查 NE、NW、SE、SW,但我的代码中数组总是越界。我知道为什么我一直收到它我只是不知道如何解决它。我正在寻找有关如何解决此问题的指导。这是我的代码。
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)
这是我第一次在这里发帖,希望我以正确的方式发帖。提前谢谢大家!
在访问数组之前,您必须检查索引是否在范围内。
我给你个提示,
// for NW
if (row-i>0 && col-i>0 && board[row - 1][cols - 1] == 1)
return true
你明白为什么会出现 IndexOutOfBoundException 了吗?
我目前正在研究 N Queens 问题,其中输入将是二维数组的大小和二维数组的实际值。此代码将检查此输入是否有效,因为没有任何其他皇后互相攻击,或者是否无效。如果它有效,您只需打印出 true,否则打印出 false。我的代码已完成大约 95%,但我在对角线遍历 2D 数组时遇到了问题。我希望能够沿对角线方向检查 NE、NW、SE、SW,但我的代码中数组总是越界。我知道为什么我一直收到它我只是不知道如何解决它。我正在寻找有关如何解决此问题的指导。这是我的代码。
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)
这是我第一次在这里发帖,希望我以正确的方式发帖。提前谢谢大家!
在访问数组之前,您必须检查索引是否在范围内。
我给你个提示,
// for NW
if (row-i>0 && col-i>0 && board[row - 1][cols - 1] == 1)
return true
你明白为什么会出现 IndexOutOfBoundException 了吗?