この関数がどのように機能するかを理解しようとしています。数独パズルを生成するためのいくつかのアルゴリズムを研究し、これを見つけました。
関数をテストしたところ、有効な 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;
}
EDIT 素晴らしい、私は構造を理解しました。lijie の回答に感謝します。私がまだ理解していないのは、ランダムな順序で値を試す部分です)。また、乱数を配置した後、グリッドが再度有効かどうかを確認する必要がありますか? –</p>