My indexoutofbounds issues has been solved but not my program compiles but prints out an unchanged puzzle.. not sure where I am going wrong?? The original puzzle read roms std input has 0s in the place of an ’empty’cell of a sudoku puzzle. I’ve included my arraylist initialiser as well.
public ArrayList<Integer> create(){
ArrayList<Integer> possible = new ArrayList<Integer>();
for(int i=1; i<10; i++){
possible.add(i);
}
return possible;
}
public sudoku( int size )
{
SIZE = size;
N = size*size;
Grid = new int[N][N];
for( int i = 0; i < N; i++ )
for( int j = 0; j < N; j++ )
Grid[i][j] = 0;
}
public void solve()
{
int a, b, c, d, i, j, k, l;
int count = 0;
int value= 0;
for(i=0; i<N;i++){
for(j=0; j<N;j++){
if(Grid[i][j]==0){
ArrayList<Integer> possible = create();
//check row
for(a=0; a<N;a++){
for(b=0; b<N; b++){
if(Grid[a][0]==possible.get(a)){
possible.set(a, 0);
}
}
}
//check column
for(c=0; c<N;c++){
for(d=0; d<N;d++){
if(Grid[0][d]==possible.get(d)){
possible.set(d,0);
}
}
}
for(k=0; k<9; k++){
if(possible.get(k)!=0){
count++;
}
}
if(count==1){
for(l=0; l<9; l++){
if(possible.get(l)!=0){
value=possible.get(l);
}
}
}
Grid[i][j]=value;
}
}
}
}
I see your problem, you’re using the i and j variables as indices more than once in nested for loops:
By advancing the indices from within the for loop, you risk going past the maximal index, and so by the time you reach the bottom, your i and j have been incremented all the way to 9, past the size of the row and column. You should almost never change a for loop index from inside the for loop. You will want to re-write this code.
Edit: it’s even simpler than that: You’re checking i after a for loop has concluded, so that i is the value of the top bound. Run this to see what I mean: