user1205722
user1205722

Reputation: 59

java sudoku solver values not changing

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;
            }
        }
    }
}

Upvotes: 1

Views: 320

Answers (2)

Hovercraft Full Of Eels
Hovercraft Full Of Eels

Reputation: 285415

I see your problem, you're using the i and j variables as indices more than once in nested for loops:

  for (i = 0; i < N; i++) { // **** you use "i" it here
     for (j = 0; j < N; j++) { // **** and "j" here
        if (Grid[i][j] == 0) {

           ArrayList<Integer> possible = create();

           for (i = 0; i < N; i++) { // **** and again here
              for (j = 0; j < N; j++) { // **** and again here
                 if (Grid[i][0] == possible.get(i)) {
                    possible.set(i, 0);
                 }
              }
           }

           for (i = 0; i < N; i++) { // **** and again here
              for (j = 0; j < N; j++) { // **** and again here
                 if (Grid[0][j] == possible.get(i)) {
                    possible.set(i, 0);
                 }
              }
           }

           // ....

           Grid[i][j] = value;
        }
     }
  }

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:

  for (i = 0; i < N; i++) {
     for (i = 0; i < N; i++) {
        System.out.println("C) i = " + i);
     }
     System.out.println("D) i = " + i);
  }

Upvotes: 2

user1334069
user1334069

Reputation:

Try printing out possible.get(0) to make sure it's not empty! If that throws the error, then there you go!

Or, you could try a try statement in between loops to figure out which part throws it, as below.

try{
    ArrayList<Integer> possible = create();
}
catch(ArrayIndexOutOfBoundsException e){
         System.out.println(1);
}
try{
                //check row             
                for(i=0; i<N;i++){
                    for(j=0; j<N;j++){  
                        if(Grid[i][0]==possible.get(i)){
                            possible.set(i, 0);
                        }
                    }
                }
}
catch(ArrayIndexOutOfBoundsException e){
         System.out.println(2);
}
try{
                //check column
                for(i=0; i<N;i++){
                    for(j=0; j<N;j++){  
                        if(Grid[0][j]==possible.get(i)){
                            possible.set(i,0);
                        }
                    }
                }
}
catch(ArrayIndexOutOfBoundsException e){
         System.out.println(3);
}
try{
                for(k=0; k<9; k++){
                    if(possible.get(k)!=0){
                        count++;
                    }
                }
}
catch(ArrayIndexOutOfBoundsException e){
         System.out.println(4);
}
try{
                if(count==1){
                    for(l=0; l<9; l++){
                        if(possible.get(l)!=0){
                            value=possible.get(l);
                        }
                    }
                }
}
catch(ArrayIndexOutOfBoundsException e){
         System.out.println(5);
}
try{
                Grid[i][j]=value;}
catch(ArrayIndexOutOfBoundsException e){
         System.out.println(6);
}

Upvotes: 0

Related Questions