I am trying to write a sudoku solver with backtracking right now and I solved some problems already but I don't know what to do now.
This is the Problem:
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)
When I run the code
I don't expect to get the right code handed to me, i just appreciate every help.
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);
}
}