【问题标题】:Random sudoku generation随机数独生成
【发布时间】:2010-12-30 10:51:27
【问题描述】:

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

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 之间的随机数。

【问题讨论】:

  • 翻译意大利语(?) cmets 和变量名会很有帮助
  • 翻译了一下...quanti 只是要生成的单元格的数量,indexes 只是一个包含两个整数的结构

标签: c++ c sudoku random


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回复,我先清理了代码。但我的问题不是解决数独,我已经写了求解器,我需要的是数独谜题的生成器,我不介意这个谜题是否可以解决。我只需要将“quanti”随机数放入数独谜题的“quanti”单元格中。
  • 那你只需要我的第三点。即生成一个大小为“quanti”的数组,其中包含您要添加到单元格的所有数字,并从数组中删除您添加到单元格的每个元素。您可以对单元格块中的索引对执行相同的操作。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我的建议:使用在别处找到的某种算法创建一个完整(已解决)的谜题,然后随机擦除一定百分比的单元格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      • 1970-01-01
      • 2011-10-24
      相关资源
      最近更新 更多