我试图了解这个函数是如何工作的,我研究了几种算法来生成数独谜题并找到了这个。
测试了该功能,它确实生成了一个有效的 9x9 拉丁方(数独)网格。我的问题是我不明白这个函数是如何工作的,我知道结构是由 ints、p 和 b 组成的,p 将保存表格中单元格的数字,但之后我不明白为什么它创建了更多数组(选项卡 1 和选项卡 2)以及它如何检查拉丁方 =/ 等,总而言之,我完全迷失了。
我不是要求逐行解释,这个函数背后的一般概念。对我有很大帮助!
再次感谢<3
int sudoku(struct sudoku tabla[9][9],int x,int y)
{
int tab[9] = {1,1,1,1,1,1,1,1,1};
int i,j;
for(i=0;i<y;++i)
{
tab[tabla[x][i].p-1]=0;
for(i=0;i<x;++i)
{
tab[tabla[i][y].p-1]=0;
}
for(i=(3*(x/3));i<(3*(x/3)+3);++i)
{
for(j=(3*(y/3));j<y;++j)
{
tab[tabla[i][j].p-1]=0;
}
}
int n=0;
for(i=0;i<9;++i)
{
n=n+tab[i];
}
int *tab2;
tab2=(int*)malloc(sizeof(int)*n);
j=0;
for(i=0;i<9;++i)
{ if(tab[i]==1)
{
tab2[j]=i+1;
j++;
}
}
int ny, nx;
if(x==8)
{
ny=y+1;
nx=0;
}
else
{
ny=y;
nx=x+1;
}
while(n>0)
{
int los=rand()%n;
tabla[x][y].p=tab2[los];
tab2[los]=tab2[n-1];
n--;
if(x==8 && y==8)
{
return 1;
}
if (sudoku(tabla,nx,ny)==1)
{
return 1;
}
}
return 0;
}
编辑 太好了,我现在了解结构了,谢谢李杰的回答。我仍然不明白的是以随机顺序尝试值的部分)。我不明白它如何检查随机值放置是否有效而不调用检查移动是否合法的代码部分,此外,在放置随机数之后是否有必要再次检查网格是否有效?——</p>