0

これは数独ソルバー用で、各正方形にこのメソッドがあります。私の考えでは、このメソッドの1つのインスタンスが有効な値を見つけずにループを通過すると、それを呼び出した前のメソッドに戻り、ループを続行します-forループから次の値を試行します。これでバックトラックに十分だと思っていましたが、すべてのテストが失敗し、これをどのように解決するかについてはまったくわかりません。/endnoob-嘆き

public boolean recursive() {

    for(int i = 1; i <= boardSize; i++) {

        if(!validValue(i)) {
            continue;
        } else {
            setValue(i);

            if(getNext() == null) // This signifies that I am at the end of the list
                return true;
            else 
                getNext().recursive(); // same method in the next sudoku square
        }
    }

    return false;
}
4

3 に答える 3

2

ここに 2 つの正確性の問題があります。

  1. 再帰呼び出しの結果が次のとおりであるかどうかを確認する必要trueがあります。そうである場合は、再帰を停止する必要があります。解決策が見つかりました。上書きしないでください。
  2. 具体的には、再帰の戻り値をバブルアップする必要があります-getNext().recursive();利回りがある場合true-これをバブルtrueアップする必要があります[(1)で述べたように-再帰を停止すると、解決策があります!]
于 2012-04-17T14:07:17.137 に答える
1

わかりました - 私の仲間の仲間がこれを手伝ってくれて、何が欠けているのかを理解してくれました.

ループが完了したら、メソッドはその値をリセットする必要があります。そうでない場合、バックトラックの前に以前にテストされた古い値は、バックトラックの後も残ります。これは、isValid() メソッドが指定された正方形が属する列、行、およびボックスをチェックするときに、isValid() メソッドが以前に設定された多くの値を見つけることを意味します。

必要だったのは、'return false;' の前の 1 行だけでした。

//(end of for-loop)  
setValue(0);  
return false;  
//(method ends)
于 2012-04-21T21:20:42.400 に答える
0

getNext() を 2 回呼び出しています。if ステートメントで null が返されない場合は、もう一度呼び出します。よろしいですか?

于 2012-04-17T14:09:36.933 に答える