2011-11-11 122 views
1

好的,所以我試圖讓一個Java程序來解決picross板,但我不斷收到一個Stackoverflow錯誤。我現在只是教自己一點Java,所以我喜歡使用我所知道的東西,而不是在網上找到解決方案,儘管我的方式顯然不是那麼高效。我能想到解決這個問題的唯一方法就是通過一種蠻力,嘗試一切可能性。事情是,我知道這個函數可以工作,因爲它適用於較小尺寸的電路板,唯一的問題是,在較大的電路板上,我傾向於在函數完成之前得到錯誤。遞歸Stackoverflow錯誤

所以char[][] a只是與所有的X和O的遊戲板。 int[][] b是一個數組,其數字分配給picross板,如遊戲頂部和左側的數字。 isDone()只是檢查董事會是否與給定的數字匹配,並且shift()向下移動一列。我不想粘貼我的整個程序,所以如果你需要更多信息,請告訴我。謝謝!

我添加了代碼,因爲有人問。 Shift只是將一行中的所有字符移動一個單元格。

更新:我在想,也許我的代碼沒有旋轉通過每個組合,所以它跳過了正確的答案。任何人都可以驗證這實際上是嘗試每種可能的組合嗎?因爲這將解釋爲什麼我得到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函數而不是返回[] []。 java中已經通過引用傳遞[] []。 – Tom

+0

呃,我不確定它究竟會經歷多少次迭代。它看起來是5x5板的一個很好的部分。碰撞前通常可以處理多少個?我將如何去做移動無效功能? –

回答

0

檢查遞歸調用並給出終止條件。

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

如果終止條件,你的意思是我得到的錯誤,就是這樣。在線程「main」java.lang.StackOverflowError中出現異常,然後它重複40次中main函數的行。我不知道你的意思是通過檢查遞歸調用。 –

+0

您必須知道您要調用該功能的次數。 – vikky

+0

對不起,我對Java仍然很陌生。我不知道如何使用終止條件。那麼最初,我打算直接爲for循環解決它,但由於板的大小發生了變化,我不得不切換到遞歸。 –