2017-03-22 4 views
-1

ここではこの方法があります。理想的には、Qsをボードに置くことによって8クイーンの問題を解決し、互いに脅かさないようにする必要がありますが、無限に再帰するのを止めることはできません。 この再帰メソッドからスタックオーバーフローを取得していますか?

public static boolean isSafe(int row, int col, int size, char[][] array) { 
    //check column 
    for (int i = 0; i < size - 1; i++) { 
     if (array[i][col] == 'Q') { 
      return false; 
     } 
    } 
    //horizontal 
    for (int i = size - 1; i >= 0; i--) { 
     if (array[row][i] == 'Q') { 
      return false; 
     } 
    } 
    //up diagonal 
    while (row > 0 && col > 0) { 
     int x = row; 
     int y = col; 
     if (array[row - 1][col - 1] == 'Q') { 
      return false; 
     } else { 
      x--; 
      y--; 
     } 
    } 
    //down diagonal 
    while (row < size - 1 && col > 0) { 
     int x = row; 
     int y = col; 
     if (array[row + 1][col - 1] == 'Q') { 
      return false; 
     } else { 
      x++; 
      y--; 
     } 
    } 
    return true; 
} 

は、あなたがこれに当てることができます任意の光をありがとう:

public static void solve(int row, int col, int size, char[][] array) { 
    for (int i = 0; i < size - 2; i++) { 
     if (isSafe(row, col, size, array)) { 
      array[i][col] = 'Q'; 
     } else { 
      if (col < size - 2) { 
       solve(row, col++, size, array); //changed ++ to +1 
      } 
     } 
    } 
} 

は明確にするために、ここに含ま 'isSafe' メソッドです。
EDIT: '++'を '+1'に変更するとスタックのオーバーフローを止めることができたが、私のメソッドはそれが欲しいように再帰しないことが分かった。

+8

[デバッガとは何ですか?]問題の診断にはどのように役立ちますか?(http://stackoverflow.com/questions/25385173/what-is-a-debugger-and-問題を特定することはできません) – Raedwald

+0

"私はそれが欲しいのと同じように[sic]を再帰しません"という問題はありません。出力とデバッグトレースを表示します。 – Prune

答えて

0

問題はsolve(row, col++, size, array); で解決されるまで、colはインクリメントされません。 使用する必要がありますsolve(row, ++col, size, array);

関連する問題