2011-11-11 20 views
1

申し訳ありませんが、私はpicrossボードを解決するためにJavaプログラムを作成しようとしていますが、私はStackoverflowエラーを取得し続けます。私は現在、ちょっとしたJavaを教えているだけなので、私の方法は明らかに効率的ではありませんが、私は解決策をオンラインで見つけるよりも、私が知っていることを利用したいと思っています。私がこれを解決すると考えることができる唯一の方法はあらゆる可能性を試して、一種の力ずくであった。問題は、より大きなボードでは機能が終了する前にエラーが発生する傾向があることです。再帰的なStackoverflowエラー

だからchar[][] aはすべてのXとOを持つゲームボードです。 int[][] bは、picrossボードに割り当てられた番号がゲームの左上と左にあるような配列です。 isDone()は、ボードが指定された数字と一致するかどうかを確認し、shift()は1つの列を下にシフトします。プログラム全体を貼り付けたくないので、もっと情報が必要な場合は教えてください。ありがとう!

誰かが尋ねてからshiftのコードを追加しました。 Shiftキーを押すと、1行のすべての文字が1つのセルに移動します。

更新:私のコードがすべての組み合わせを回転していない可能性がありますので、正解をスキップします。誰もが実際にすべての可能な組み合わせを試していることを確認することはできますか?それはなぜ私がstackoverflowエラーを取得しているのかを説明します。一方で、それはあまりにも多くなる前に、これが何回繰り返されますか?

public static void shifter(char[][] a, int[][] b, int[] clockwork) 
{ 
    boolean correct = true; 

    correct = isDone(a, b); 

    if(correct) 
     return; 

    clockwork[a[0].length - 1]++; 

     for(int x = a[0].length - 1; x > 0; x--) 
     { 
      if(clockwork[x] > a.length) 
      { 
       shift(a, x - 1); 

       clockwork[x - 1]++; 
       clockwork[x] = 1; 
      } 

      correct = isDone(a, b); 

      if(correct) 
       return; 
     } 

    shift(a, a[0].length - 1); 

    correct = isDone(a, b); 

    if(correct) 
     return; 

    shifter(a, b, clockwork); 

    return; 
} 

public static char[][] shift(char[][] a, int y) 
{  
     char temp = a[0][y]; 

      for(int shifter = 0; shifter < a.length - 1; shifter++) 
      { 
       a[shifter][y] = a[shifter + 1][y]; 
      } 

     a[a.length - 1][y] = temp; 

    return a; 
} 
+0

繰り返し回数/再帰回数が爆発した後 – Tom

+0

[] []を返すのではなく、シフターをvoid関数にすることを検討してください。 a [] []はすでにjavaで参照渡しされています。 – Tom

+0

ええと、私は正確に何回繰り返しているのかは分かりません。それは5x5ボードの良い部分のようです。クラッシュする前にどれくらい処理できますか?シフターをボイド関数にする方法は? –

答えて

0

再帰呼び出しを確認し、終了条件を指定します。

if(terminate condition) 
{ 
exit(); 
} 
else 
{ 
call shifter() 
} 
+0

終了条件によって、私が得ているエラーを意味するなら、これです。スレッド "main" java.lang.StackOverflowErrorで例外が発生し、mainの関数を含む行が40回くらい繰り返されます。私はあなたが再帰呼び出しをチェックすることによって何を意味するか分からない。 –

+0

関数を何回呼び出すかを知っておく必要があります。 – vikky

+0

申し訳ありませんが、私はまだかなり新しいJavaです。私はどのように終了条件を使用するか分からない。まあ、もともと、私は、まっすぐなfor-loopsでそれを解決しようと考えていましたが、ボードのサイズが変わったので、再帰的に切り替える必要がありました。 –