int fixed[9][9];
void PRINT(int sudu[],int i,int j)
{
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
printf("%2d,",sudu[i*9+j]);
}
printf("\n");
}
}
void tryNext(int sudu[],int i,int j)
{
//if(valid)
int num=1;
bool valid=true;
if(fixed[i][j])
{
if(j>=8)
{
if(i==8)
{
PRINT(sudu,i,j);
}
else
tryNext(sudu,i+1,0);
}
else
tryNext(sudu,i,j+1);
return;
}
for( num=1;num<=9;num++)
{
//行是否冲突
int k=0;
for(;k<9;k++)
{
if(sudu[i*9+k]==num)
{
goto NEXT;
}
}
//列是否冲突
for(k=0;k<9;k++)
{
if(sudu[k*9+j]==num){
goto NEXT;
}
}
//小矩形是否冲突
int h = i/3;
int l = j/3;
for(int m=0;m<3;m++)
{
for(int n=0;n<3;n++)
if(sudu[(h*3+m)*9+(l*3)+n]==num ){
goto NEXT;
}
}
if(valid)
{
//都不冲突
sudu[i*9+j]=num;
if(j>=8)
{
if(i==8)
{
PRINT(sudu,i,j);
}
else {
tryNext(sudu,i+1,0);
}
}
else
tryNext(sudu,i,j+1);
}
NEXT:;
}
sudu[i*9+j]=0;
}
int main(int argc,char*argv[])
{
int sudu[9][9]={
8,+0,+0,+0,+0,+0,+0,+0,+0,
+0,+0, 3, 6,+0,+0,+0,+0,+0,
+0, 7,+0,+0, 9,+0, 2,+0,+0,
+0, 5,+0,+0,+0, 7,+0,+0,+0,
+0,+0,+0,+0, 4, 5, 7,+0,+0,
+0,+0,+0, 1,+0,+0,+0, 3,+0,
+0,+0, 1,+0,+0,+0,+0, 6, 8,
+0,+0, 8, 5,+0,+0,+0, 1,+0,
+0, 9,+0,+0,+0,+0, 4,+0,+0,
};
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
if(sudu[i][j]!=0)
fixed[i][j] = 1;
}
}
tryNext(&sudu[0][0],0,0);
return 0;
}
这个不管什么样的初始化,全都重新搜索一遍,会搜索所有可能的结果,而不是搜索到结果后就停止的那种,暴力法。