HDU 1426 Sudoku Killer

该题是一个DFS的应用,该题的关键在于建立一个结构体来存储要你填入的数据,这要就不会像无头苍蝇一样乱搜索,同时也会剪枝不少;同时就是判断横竖不能又重复的,也就是不能等于你要填入的数据,还有一点就是每个小3*3的矩阵要是1-9不能重复,这里就对该坐标x/3*3就可以了;

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct node
{
int x,y;
}q[100];
int map[9][9],res,flag;
bool judge( int n,int num )
{
for( int i=0;i<9;i++ )//横竖判断是否重复
{
if( map[q[n].x][i]==num||map[i][q[n].y]==num )
return false;
}
int x=q[n].x/3*3;
int y=q[n].y/3*3;
for( int i=0;i<3;i++ )//小矩阵的判断
{
for( int j=0;j<3;j++ )
if( map[x+i][y+j]==num )
return false;
}
return true;
}
void DFS( int sum )
{
if( res==sum )
{
flag=1;
for( int i=0; i<9; i++ )
{
for( int j=0; j<9; j++ )
{
printf( j==8?"%d\n":"%d ",map[i][j] );

}
}
return ;
}
else
{
for( int i=1;i<=9&&flag==0;i++ )
{
if( judge( sum,i ) && flag==0 )
{
map[q[sum].x][q[sum].y]=i;
DFS( sum+1 );
map[q[sum].x][q[sum].y]=0;
}
}
}
}
int main( )
{
char num[2];
int Case=0;
res=0;
while( scanf( "%s",num )!=EOF )
{
res=0;
flag=0;
if( num[0]!='?' )
map[0][0]=num[0]-'0';
for( int i=0;i<9;i++ )
for( int j=0;j<9;j++ )
{
if( !(0==i&&j==0 ))scanf( "%s",num );
if( num[0]=='?' )
{
q[res].x=i;
q[res].y=j;
map[i][j]=0;
res++;
}
else
{
map[i][j]=num[0]-'0';
}
}
if( Case++ )
puts( "" );
DFS( 0 );
}
return 0;
}

posted @ 2011-09-21 21:33  wutaoKeen  阅读(224)  评论(0编辑  收藏  举报