我正在编写一个函数,该函数应该为模拟项目生成随机数独谜题;该函数将要生成的单元格数量作为参数,然后生成单元格索引和要放入这些单元格中的数字。
我在生成单元格索引时遇到问题,我不是编程专家,我找不到一个好的例程来生成索引并检查是否两次或更多次是相同的索引。其功能为:
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 之间的随机数。
首先,我会删除所有#pragma omp parallel
指令,直到您拥有可以运行的代码。现在它只会降低可读性。
其次,如果您想生成“未解决的”数独(即大多数数字未填写的数独),您通常会随机填写一些数字,然后通过让计算机解决它来测试数独。如果计算机成功,则意味着您开始使用正确的数独。Here http://www.eddaardvark.co.uk/sudokusolver.html您会找到解决数独算法的很好的解释。
第三,请注意,您想要放入数独谜题中的数字受到很大限制。如果 3x3 块(或 9x1 行或列)包含 1,则无法向该块(行、列)添加额外的 1,如果 9x9 块包含 9 个 1,则无法向其添加额外的 1,等等因此,最好用您可以添加的所有数字填充一个数组数组(所有 3x3 块有 9 个 1-9 的数组),然后从这些数组中随机取出元素并将它们放入相应 3x3 块中的拼图中。这样您至少可以避免将重复数字添加到同一个 3x3 块中的情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)