随机数独生成

时间:2009-12-28 11:14:45

标签: c++ c sudoku random

我正在编写一个应该为模拟项目生成随机数独游戏的函数;这个函数将生成的单元格数作为argoument,然后生成要放入这些单元格的单元格和数字的索引。 我在生成单元格索引时遇到问题,我不是编程方面的专家,我找不到一个好的例程来生成索引,并且检查不是两次或更多次相同的索引。功能是:

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是{大约17岁左右 casuale()只返回1到9之间的随机数。

3 个答案:

答案 0 :(得分:5)

首先,我将删除所有#pragma omp parallel指令,直到您的代码有效。现在它只是降低了可读性。

其次,如果你想生成“未解决的”数独(即没有填写大部分数字的那些),你通常会做的是随机填写几个数字,然后通过让计算机解决它来测试数独。如果comupter成功,则意味着你开始使用正确的数独游戏。 Here你找到了解决sudokus的算法的一个很好的解释。

第三,要注意你想要放入数独谜题中的数字受到很大限制。如果3x3块(或9x1行或列)包含1,则无法向块(行,列)添加额外的1,如果9x9块包含9个1,则无法向其添加额外的1,等等所以可能最好用你可以添加的所有数字填充一个数组数组(所有3x3块的九个数组1-9)并随机从这些数组中取出元素并将它们放入相应3x3块中的拼图中。这样,您至少可以避免将重复数字添加到同一个3x3块中的情况。

答案 1 :(得分:0)

您不需要随机数生成算法。您已经知道这些数字:它们是唯一的,并且在1..n范围内,其中n应为<= 9,适用于尺寸为9x9或更小的数独板。你需要的是一种方法来改变数字1..n,然后将它们分配给'索引'。对于改组,Fisher-Yates shuffle非常简单,高效。

使用它将消除随机数生成的需要,并希望goto也是如此。

答案 2 :(得分:0)

我的建议:使用其他地方找到的算法创建一个完整的(已解决的)拼图,然后随机删除一定比例的单元格。