私はC++を初めて使い、家の割り当て(sudoku)をしなければならない。私は問題に固執しています。C++ - sudokuのゲームを解決する
問題は、スードクを解く検索関数を実装することです。
命令: 解決策を見つけるために、再帰的検索は以下のように使用されます。 桁(d1 .... dn)(n> 1)のフィールドがまだ割り当てられていないとします。次に、最初に にフィールドを割り当てて、伝播を実行してから、 を再帰的に実行しようとします。 伝播が失敗することがあります(フィールドは になります)。その場合、検索は失敗し、 フィールドのいずれかの異なる桁を試してみる必要があります。検索が再帰的であるため、最後に考えられるフィールドの次の数字が になります。いずれの桁も解に至らない場合、検索は再び失敗します。 のこれは、前のフィールドと異なる桁の試行につながります。
桁dは、それを するフィールドを割り当てることによって試される前に、( にコピーコンストラクタを使用して、新しいとヒープからボードを割り当てる)、現在のボードのコピーされている新しいボードを作成する必要があります。 のみがコピーの割り当てを実行します。再帰呼び出しの検索が に失敗した場合は、次の桁の新しいボードを作成して、 が試行されるようにすることができます。
私が試した:
// Search for a solution, returns NULL if no solution found
Board* Board::search(void) {
// create a copy of the cur. board
Board *copyBoard = new Board(*this);
Board b = *copyBoard;
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
// if the field has not been assigned, assign it with a digit
if(!b.fs[i][j].assigned()){
digit d = 1;
// try another digit if failed to assign (1 to 9)
while (d <=9 && b.assign(i, j, d) == false){
d++;
// if no digit matches, here is the problem, how to
// get back to the previous field and try another digit?
// and return null if there's no pervious field
if(d == 10){
...
return NULL;
}
}
}
}
return copyBoard;
}
もう一つの問題は、再帰呼び出しを使用することがどこにあるのでしょうか?任意のヒント?どうも!
完全な命令は、ここで発見されてすることができますhttp://www.kth.se/polopoly_fs/1.136980!/Menu/general/column-content/attachment/2-2.pdf
コード:http://www.kth.se/polopoly_fs/1.136981!/Menu/general/column-content/attachment/2-2.zip
この時点でどのような再帰があり、どのように使用するのか考えていますか? –