0

数独ジェネレーターを実行しているときに、27回スタックオーバーフローが発生した後。

void start(int todel){
int number;
for (int x=0; x<9; x++) {
    for (int y=0; y<9; y++) {

        number = GenN(x, y);
        osudoku[x][y]=number;
    }
}
replace(todel);
output();
}


int GenZ(int x, int y){
    int number;
    bool duplication = true;
    Randomize();
    number = Random(9)+1;
    duplication = check(number,x,y);
    if (duplication==true){
        return GenZ(x,y);
    }
    else if (duplication==false) {
        return number;
    }
}

私はこのコードでそれが何かだと思います。次のようなものを生成します。

758 431 629 
913 267 485 
642 985 317
Stack Overflow

だから私は1/3数独を手に入れます。

4

3 に答える 3

2

ソリューションにバックトラッキングを追加する必要があります。

このシナリオを考えてみましょう: (アルゴリズムのある時点で発生する可能性があります)

1 2 3 | 4 5 6 | 7 8 9
4 5 6 | 1 2 3 | ? _ _
...

プログラムは に適合する値を探し続けます?が、そのような値は存在しません。

代わりに、プログラムは適合する値がないことを確認し、別の値を試してみる必要がありますが、これも機能3しません。21789

1 2 3 | 4 5 6 | 7 8 9
4 5 6 | 7 8 9 | ? _ _
...

その場合、正常に続行できます。

この:

zahl = Random(9)+1;

上記の例のように、適合しない値を取得し続ける可能性があるため、実際には機能しません。いつバックトラックするかわかりません。9 つの値すべてをループすることをお勧めします。9 つの値すべてをループした後、値が適合しないことがわかり、バックトラックする必要があることがわかります。

于 2013-03-14T07:56:03.383 に答える
0

GenZ で duplication==true の場合、同じ x,y を使用して再度呼び出され、再度 duplication==true? が生成されます。特に "number" を変更しているのを見ることができないので、0 のような初期化された値である可能性があります。

于 2013-03-14T07:42:45.537 に答える
0
if (duplication==true){
    return GenZ(x,y);
}

それが数独を作成する実行可能な方法であるかどうかはわかりません。どのように実装してもブルートフォースには時間がかかる場合がありますが、再帰を使用せずにループを作成することで、おそらくスタックオーバーフロー エラーを取り除くことができます。

while (duplication){
于 2013-03-14T07:42:49.550 に答える