我想立即用回溯編寫一個數獨求解器,我已經解決了一些問題,但是現在我不知道該怎麼做。在線程中的Java異常main java.lang.arrayIndexoutofboundsexception 9
這就是問題所在:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
at ISudoku.NumberOnBoard(ISudoku.java:19)
at ISudokuSolver.containedinRoC(ISudokuSolver.java:23)
at BacktrackingISudokuSolver.backtracking(BacktrackingISudokuSolver.java:10)
at BacktrackingISudokuSolver.backtracking(BacktrackingISudokuSolver.java:19)
at BacktrackingISudokuSolver.backtracking(BacktrackingISudokuSolver.java:19)
at BacktrackingISudokuSolver.backtracking(BacktrackingISudokuSolver.java:19)
at BacktrackingISudokuSolver.backtracking(BacktrackingISudokuSolver.java:19)
at BacktrackingISudokuSolver.backtracking(BacktrackingISudokuSolver.java:19)
at BacktrackingISudokuSolver.backtracking(BacktrackingISudokuSolver.java:19)
at BacktrackingISudokuSolver.backtracking(BacktrackingISudokuSolver.java:19)
at BacktrackingISudokuSolver.backtracking(BacktrackingISudokuSolver.java:19)
at BacktrackingISudokuSolver.backtracking(BacktrackingISudokuSolver.java:19)
at BacktrackingISudokuSolver.solveSudoku(BacktrackingISudokuSolver.java:4)
at Examples.main(Examples.java:17)
當我運行代碼
我不指望能得到遞給了我正確的代碼,我只是欣賞每一個幫助。
public class ISudoku {
private boolean[][] sudokuboolean;
private int[][] sudokuboard;
private int size;
public ISudoku(int size){
this.size = size;
sudokuboard = new int[size][size];
sudokuboolean = new boolean[size][size];
}
public void setNumber(int i, int j, int number, boolean given){
sudokuboard[i][j] = number;
sudokuboolean[i][j] = given;
}
public int NumberOnBoard(int i, int j){
return sudokuboard[i][j];
}
public int getSize(){
return size;
}
public String toString(){
String string = "";
for(int i = 0; i < size; i++){
for(int j = 0; j < size; j++){
if(sudokuboolean[i][j]){
string += "<" + sudokuboard[i][j] + "> ";
}
else{
string += sudokuboard[i][j] + " ";
}
if(j == 2 || j == 5){
string += " ";
}
}
string += "\n";
if(i == 2 || i == 5){
string += "\n";
}
}
return string;
}
}
public abstract class ISudokuSolver {
public abstract boolean solveSudoku(ISudoku sudoku);
public boolean containedin3x3(ISudoku sudoku,int row, int col, int value){
int firstRow = row/3 * 3;
int firstCol = col/3 * 3;
for(int i = firstRow; i < firstRow+3; i++){
for(int j = firstCol; j < firstCol+3; j++){
if(!(i == row && j == col)){
if(sudoku.NumberOnBoard(i,j) == value){
return true;
}
}
}
}
return false;
}
public boolean containedinRoC(ISudoku sudoku,int row, int col, int value){
for(int i = 0; i < 9;i++){
if(i != col){
if(sudoku.NumberOnBoard(row,i) == value){
return true;
}
}
if(i != row){
if(sudoku.NumberOnBoard(i,col) == value){
return true;
}
}
}
return false;
}
}
public class BacktrackingISudokuSolver extends ISudokuSolver{
public boolean solveSudoku(ISudoku sudoku){
backtracking(0,1,sudoku);
return true;
}
private boolean backtracking(int row,int number, ISudoku sudoku){
for(int i = 0; i < sudoku.getSize();i++){
if(!containedinRoC(sudoku,row,i,number) && !containedin3x3(sudoku,row,i,number)){
sudoku.setNumber(row,i,number,false);
if(row == sudoku.getSize()-1 && i == sudoku.getSize()-1 && number != 9){
number += 1;
}
if(row == sudoku.getSize()-1 && i == sudoku.getSize()-1 && number == 9){
return true;
}
else{
if(backtracking(row+1,number,sudoku)){
return true;
}
else{
sudoku.setNumber(row,i,0,false);
}
}
}
}
return false;
}
}
public class Examples extends BacktrackingISudokuSolver {
public static void main(String[] args) {
ISudokuSolver solver = new BacktrackingISudokuSolver();
ISudoku sudoku = new ISudoku(9);
System.out.println(sudoku);
System.out.println("Beispiel 1: ");
System.out.println("Lösbar? (Erwartet): Ja");
System.out.println("Benötigte Zeit? (Erwartet): 15 ms (Intel i5 3,8 Ghz)");
long start = System.currentTimeMillis();
boolean solvable = solver.solveSudoku(sudoku);
long end = System.currentTimeMillis();
System.out.println("Lösbar?: " + solvable);
System.out.println("Benötigte Zeit: " + (end - start) + " ms");
System.out.println(sudoku);
}
}
我建議你在調試器中調試你的代碼,並捕獲這個異常,這樣你就可以看到它發生的原因。 –
和堆棧跟蹤?它應該明確指出哪一行負責超出範圍的數組訪問。 –
http://stackoverflow.com/questions/5554734/what-causes-a-java-lang-arrayindexoutofboundsexception-and-how-do-i-prevent-it – assylias