-1

このコードは解決された数独行列を生成するはずですが、while ステートメントはそれを無限ループに入れます。while ステートメントを削除すると、一部の値がまだ 99 または 0 の行列が得られます。また、9 つの乱数を 1 つずつ一意に生成することはできません。コードを実行して確認する場合は、While ステートメントを削除してください。

int a[9][9];
int b[9][9];

int inputvalue(int x, int y, int value) //checks horizontally, vertically and 3*3matrix for conflicts


{

    int i, j;

    for (i = 0; i < 9; i++)
    {
       if (value == a[x][i] || value == a[i][y])
          return 0;
    }

    for (i = (x / 3) * 3; i <= ((x / 3) * 3) + 2; i++)
    {
       for (j = (y / 3) * 3; j <= ((y / 3) * 3) + 2; j++)
          if (b[i][j] == value)
         return 0;
    }
    return value;
}

int main()
{
    int i, j, k;
    unsigned int s;
    cout << "sudoku\n";
    time_t t;

    s = (unsigned) time(&t);
    srand(s);
    for (i = 0; i < 9; i++)
    {
       for (j = 0; j < 9; j++)
         a[i][j] = 99;
    }

    for (i = 0; i < 9; i++)
    {
       for (j = 1; j <= 9; j++)//j is basically the value being given to cells in the matrix while k assigns the column no. 
       while(a[i][k]==99||a[i][k]==0)
       {
          k = rand() % 9;
          a[i][k] = inputvalue(i, k, j);
       }
    }

    for (i = 0; i < 9; i++)
    {
       for (j = 0; j < 9; j++)
       {
           cout << a[i][j] << "    ";
       }
       cout << endl;
    }

    return 0;
    getch();
}
4

1 に答える 1

2

ここ=では、 equality の代わりに assignを使用しています。==

 while(a[i][k]=99||a[i][k]=0)
              ^           ^

これは次のようになります。

 while(a[i][k]==99||a[i][k]==0)

a[i][k]=99元のコードはそのままではコンパイルされませんが、ゼロ以外であるためtrue、常に評価されます。99gcc

また、初期化される前の while ループでの使用は未定義の動作であり、ループの反復ごとに絶えず変化する ka に対して終了ロジックが意味をなすかどうかは不明です。k

無限ループのもう 1 つの原因は、場合によってはinputvalue戻ってこなく0なることがあるため、無限ループを防ぐために少し調整する必要があります。

また、srand(time(NULL));擬似乱数ジェネレーターを初期化するより一般的な方法です

于 2013-07-24T11:58:00.410 に答える