我目前正在研究N皇后問題,其中輸入將是二維數組的大小和二維數組的實際值。這段代碼將檢查這個輸入是否有效,因爲沒有其他皇后互相攻擊,或者沒有。如果它有效,你只需打印出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)
這是我第一次張貼在這裏,所以我希望我發佈正確的方式問題。在此先感謝你們!
你是否已經在調試器中檢查了代碼?你發現了什麼?你爲什麼不在你的文章中包含堆棧跟蹤?請訪問[幫助]並閱讀[問]以瞭解如何有效地使用本網站。 –
@JimGarrison是的,我已經使用了我的調試器,它說它在行[0] col [1]上遇到第一個時出界(-1)。我知道發生這種情況是因爲當board [row - 1] [cols + 1] == 1被調用時,行已經在0,因此0 - 1 = -1這意味着這是數組越界異常。就像我在我的問題中所述,我知道問題是什麼,我只需要指導如何解決問題。 – Rcordero
對不起,這不是StackOverflow的工作原理。我們不會重寫您的代碼來處理邊界條件,這是您需要解決的問題。 –