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");
}
}