2012-04-15 9 views
1

私のindexoutofboundsの問題は解決されていますが、プログラムはコンパイルされませんが、変更されていないパズルが印刷されます。元のパズルを読んでROMの標準入力は、スドクパズルの '空'の代わりに0を持っています。私はarraylistイニシャライザーも含めました。java sudokuソルバの値が変更されない

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

グリッドのサイズを初期化した場所がわかりませんので、お手数ですが、 (またはあなたを助けることは不可能かもしれません) –

+1

私は本当に興奮していません_グリッド[私] [0] _私は数回を参照してください...それはあなたの問題ではない...まだ。 –

+1

どのラインが故障していますか? –

答えて

2

私はあなたの問題を参照してください、あなたはループのために、一度、ネストされたよりも多くの指標として、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が上限になります。これを実行して、私が意味するものを確認してください:

+0

オハイオイ私は見る!それは愚かだった。ありがとうございました – user1205722

+0

iとjはforループごとに0に設定されていますので、どこにエラーがあるのか​​分かりません。より具体的にできますか?または、あなたは、最後の声明で使用されているiとjが、彼が使用しようとしているものではないと言っていますか? (すなわち、最初のものよりも最近のforループからのものです) –

+0

実際に彼はiを入れ子にする必要はありませんが、forループが終了した後、インデックス変数はループの最大値になります。 –

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); 
} 
+0

これは不要です。例外のスタックトレースは、スローされた場所を正確に示します。 –

+0

私のプログラムはコンパイルされますが、(技術的には0である)sudokuパズルの空の値は変更されません – user1205722

関連する問題