2

シミュレーション プロジェクト用にランダム数独パズルを生成する関数を作成しています。この関数は、生成するセルの数を引数として取り、セルのインデックスとそれらのセルに入れる数値を生成します。私はセル インデックスの生成に問題があります。私はプログラミングの専門家ではありません。インデックスを生成し、同じインデックス カップルにならないようにチェックアウトするための適切なルーチンが 2 回以上見つかりません。機能は次のとおりです。

void gen_puzzle(int quanti)
{
    if(quanti>81) exit(1);
    indexes* ij=new indexes[quanti];
    int f,g,k, controllo=1;

    do
    {
    for(f=0; f<9; f++)
     for(g=0; g<9; g++)
     {
     puzzle[f][g].num=0;//puts 0 in the sudoku puzzle
     puzzle[f][g].p=0;
     }

//////////////section to improve
out:
    srand(int(time(0)+clock()));

    for(k=0; k<quanti; k++)
     ij[k].i=casuale()-1, ij[k].j=casuale()-1;//generates random indexes of sudoku cells where put random nubers

    for(f=0; f<quanti; f++)
     for(g=f+1; g<quanti; g++)
    {
     if(ij[f].i==ij[g].i && (ij[f].j==ij[g].j)) goto out;

    }
////////////////////

    for(k=0; k<quanti; k++)
     puzzle[ij[k].i][ij[k].j] . num=casuale();//puts random numbers in cells
    }
    while(dataNotGood()); //till sudoku isn't good
}

ij[]関数がランダムなインデックスを配列に入れるセクションについて助けを求めgotoますquanti
casuale()1 から 9 までの乱数を返すだけです。

4

3 に答える 3

5

#pragma omp parallelまず、コードが機能するまで、すべてのディレクティブを取り除きます。現時点では、可読性が低下するだけです。

第二に、「未解決」の数独 (つまり、ほとんどの数字が埋められていないもの) を生成したい場合、通常行うことは、いくつかの数字を無作為に入力し、コンピューターに解かせて数独をテストすることです。コンピュータが成功した場合は、適切な数独から始めたことを意味します。ここでは、数独を解くアルゴリズムの優れた説明を見つけます。

第三に、数独パズルに入れたい数字にはかなりの制約があることに注意してください。3x3 ブロック (または 9x1 の行または列) に 1 が含まれている場合、ブロック (行、列) にさらに 1 を追加することはできません。9x9 ブロックに 9 つの 1 が含まれている場合、さらに 1 を追加することはできません。 . したがって、おそらく、配列の配列に追加できるすべての数字 (すべての 3x3 ブロックで 1 ~ 9 の 9 つの配列) を入力し、これらの配列から要素をランダムに取り出して、対応する 3x3 ブロックのパズルに入れる方がよいでしょう。 . このようにして、同じ 3x3 ブロックに重複した数字を追​​加する状況を少なくとも回避できます。

于 2009-12-28T13:23:50.110 に答える
0

乱数生成アルゴリズムは必要ありません。あなたはすでに数字を知っています:それらはユニークで、範囲内1..nにあります、サイズ9x9以下の数独ボードのためにあるnべきです。<= 9必要なのは、数字をシャッフルして1..nから、それらを「インデックス」に割り当てる方法です。シャッフルの場合、Fisher-Yatesシャッフルは非常にシンプルで効率的です。

これを使用すると、乱数を生成する必要がなくなり、うまくいけば同様にgotoなります。

于 2009-12-28T16:06:04.307 に答える
0

私の提案: 他の場所で見つかった何らかのアルゴリズムを使用して完全な (解かれた) パズルを作成し、一定の割合のセルをランダムに消去します。

于 2011-07-19T14:27:21.623 に答える