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[]我为函数在数组中放置随机索引的部分寻求帮助,我使用了 a 但它不是一个好的解决方案,如果大于 17 左右goto它就不能很好地工作。只返回一个 1 到 9 之间的随机数。quanti
casuale()

4

3 回答 3

5

首先,我会去掉所有的#pragma omp parallel指令,直到你有可以工作的代码。现在它只是降低了可读性。

其次,如果您想生成“未解决的”数独(即大多数数字未填写的数独),您通常会随机填写几个数字,然后通过让计算机解决数独来测试数独。如果计算机成功,则意味着您从正确的数独开始。在这里,您可以找到解决数独​​的算法的一个很好的解释。

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

于 2009-12-28T13:23:50.110 回答
0

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

于 2011-07-19T14:27:21.623 回答
0

您不需要随机数生成算法。您已经知道这些数字:它们是独一无二的,并且在9x9 或更小的数独板的范围1..n内。您需要的是一种随机排列数字的方法,然后将它们分配给“索引”。对于洗牌,Fisher-Yates 洗牌非常简单且高效。n<= 91..n

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

于 2009-12-28T16:06:04.307 回答