数独解决矩阵,而语句给出无限循环

时间:2013-07-24 11:53:14

标签: c++ c random while-loop sudoku

此代码应生成已解决的数独矩阵,但while语句将其置于无限循环中。删除while语句给我一个矩阵,其中一些值仍为99或0.而且我不能一个一个地唯一生成9个随机数。 如果您想运行并检查代码,请删除声明。

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();
}

1 个答案:

答案 0 :(得分:2)

您正在使用作业=,而不是此处的等级==

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

这应该是:

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

a[i][k]=99将始终评估为true,因为99非零,尽管您的原始代码不会在gcc下为我编译,因此我怀疑你运行的代码有一些括号或略有不同。

在初始化之前在while循环中使用k是未定义的行为,并且不清楚您的终止逻辑对于每个循环迭代不断变化的k是有意义的。

无限循环的另一个来源是inputvalue,在某些情况下似乎卡住了返回0,所以你需要稍微调整一下以防止无限循环。

此外,srand(time(NULL));是初始化伪随机数生成器

的更常用方法