Sudoku(POJ2676)是一種簡單的數字遊戲,一個9×9的正方形表格被分成9個3×3的小正方形表格,在表格的某些單元格中,已填有數字1至9中的一個。遊戲的任務是,在表格每一個空白單元格里填入數字1至9中的一個,使得9×9正方形表格的每一行和每一列以及9個3×3小正方形表格中,數字1至9都出現且僅出現一次。
你的任務是,編程求出給定Sudoku遊戲的一種填法。
int array[9][9];
int num=0;
int pan(int i,int j,int t)
{
int a,b;
int i1,j1;
if(array[i][j]!=0)//原位置上有數
{
if(j==8&&i==8)
return 1;
if(j==8&&i<8)
{
for(a=1;a<=9;a++)
if(pan(i+1,0,a)==1)
return 1;
}
else
{
for(a=1;a<=9;a++)
if(pan(i,j+1,a)==1)
return 1;
}
}
else
{
for(a=0;a<9;a++)//看大行,大列中是否有數與t重合的
if(t==array[i][a]||t==array[a][j])
return 0;
//小矩陣中有沒有與t重合的
{
i1=i/3;
i1=i1*3;
j1=j/3;
j1=j1*3;
for(a=i1;a<i1+3;a++)
for(b=j1;b<j1+3;b++)
{
if(array[a][b]==t)
return 0;
}
}
//t暫時可以添入該位置
array[i][j]=t;
if(j==8&&i==8)
return 1;//最後一個數了,成功添數
if(j==8&&i<8)
{
for(a=1;a<=9;a++)
if(pan(i+1,0,a)==1)
return 1;
if(a==10)
{
array[i][j]=0;
return 0;
}
}
else
{
for(a=1;a<=9;a++)
if(pan(i,j+1,a)==1)
return 1;
if(a==10)
{
array[i][j]=0;
return 0;
}
}
}
}
void main()
{
int i=0,j=0,t;
for(i=0;i<9;i++)
for(j=0;j<9;j++)
array[i][j]=0;//初始化,全爲0 ,此簡化了,在原來方格中沒有添數字
for(t=1;t<=9;t++)//添第一個數
if(pan(0,0,t)==1)
break;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
printf("%4d",array[i][j]);
printf("\n");
}
}