1

我的 indexoutofbounds 问题已解决,但我的程序没有编译但打印出一个未更改的谜题.. 不知道我哪里出错了?原始拼图读取 ROM 标准输入用 0 代替数独拼图的“空”单元格。我也包含了我的arraylist 初始化程序。

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

2 回答 2

2

我看到了您的问题,您在嵌套的 for 循环中多次使用 i 和 j 变量作为索引:

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

通过从 for 循环中推进索引,您可能会超过最大索引,因此当您到达底部时,您的 i 和 j 一直递增到 9,超过了行和列的大小。您几乎不应该从 for 循环内部更改 for 循环索引。您将需要重新编写此代码。

编辑:它比这更简单:您在 for 循环结束后检查 i ,因此 i 是上界的值。运行这个看看我的意思:

  for (i = 0; i < N; i++) {
     for (i = 0; i < N; i++) {
        System.out.println("C) i = " + i);
     }
     System.out.println("D) i = " + i);
  }
于 2012-04-15T03:58:33.910 回答
0

尝试打印出 possible.get(0) 以确保它不为空!如果这引发了错误,那么你去吧!

或者,您可以尝试在循环之间使用 try 语句来确定哪个部分抛出了它,如下所示。

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);
}
于 2012-04-15T04:07:25.417 回答