Reputation: 59
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
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
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