Sudoku
Time Limit : 4000/2000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 88 Accepted Submission(s) : 28
Special Judge

1 103000509 002109400 000704000 300502006 060000050 700803004 000401000 009205800 804000107
143628579 572139468 986754231 391542786 468917352 725863914 237481695 619275843 854396127
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int flag;
int map[9][9];
int panduan(int x,int y,int z)
{
for(int j=0;j<9;j++)
{
if(map[x][j]==z&&j!=y)
{
return 0;
}
if(map[j][y]==z&&j!=x)
{
return 0;
}
}
int dx=x/3*3;
int dy=y/3*3;
for(int i=dx;i<dx+3;i++)
{
for(int j=dy;j<dy+3;j++)
{
if(map[i][j]==z&&i!=x&&j!=y)
return 0;
}
}
return 1;
}
void dfs(int k)
{
if(k==81)
{
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
printf("%d",map[i][j]);
}
cout<<endl;
}
flag=1;
return ;
}
if(flag==1)
return ;
int x=k/9;
int y=k%9;
if(map[x][y]==0)
{
for(int i=1;i<=9;i++)
{
map[x][y]=i;
if(panduan(x,y,map[x][y])==1)
dfs(k+1);
}
map[x][y]=0;
}
else
dfs(k+1);
}
int main()
{
int tt;
string c;
cin>>tt;
//scanf("%s",&tt);
c.resize(9);
while(tt--)
{
memset(map,0,sizeof(map));
flag=0;
for(int i=0;i<9;i++)
{
scanf("%s",&c[0]);
for(int j=0;j<9;j++)
{
//scanf("%s",&c[0]);
map[i][j]=c[j]-'0';
}
}
dfs(0);
}
return 0;
}
flag一定要有,否则可能会输出很多组。。。造成超时
这道题就是横着一个个的搜。