该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这个很简单的。
#include
#include
#include
using namespace std;
int map[10][10];
char s[10];
int visit1[10][10],visit2[10][10];
void print()
{
int i,j;
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{
printf("%d",map[i][j]);
}
printf("\n");
}
}
bool ok(int x,int y,int s)
{
int i,j;
for(i=(x-1)/3*3+1;i<=(x-1)/3*3+3;i++)
{
for(j=(y-1)/3*3+1;j<=(y-1)/3*3+3;j++)
{
if(i==x&&j==y)
continue;
if(map[i][j]==s)
return false;
}
}
return true;
}
bool found;
void dfs(int x,int y)
{
int i;
if(found)
return ;
if(x==9&&y==10)
{
found=true;
print();
return ;
}
if(y==10)
{
dfs(x+1,1);
}
if(map[x][y]!=0)
dfs(x,y+1);
else
{
for(i=1;i<=9;i++)
{
if(!visit1[x][i]&&!visit2[y][i]&&ok(x,y,i))
{
visit1[x][i]=1;
visit2[y][i]=1;
map[x][y]=i;
dfs(x,y+1);
map[x][y]=0;
visit1[x][i]=0;
visit2[y][i]=0;
}
}
}
}
int main()
{
int cas;
char c;
int i,j;
scanf("%d",&cas);
while(cas--)
{
found=false;
memset(visit1,0,sizeof(visit1));
memset(visit2,0,sizeof(visit2));
for(i=1;i<=9;i++)
{
getchar();
for(j=1;j<=9;j++)
{
scanf("%c",&c);
map[i][j]=c-'0';
if(map[i][j])
{
visit1[i][map[i][j]]=1;
visit2[j][map[i][j]]=1;
}
}
}
dfs(1,1);
}
return 0;
}
大二那会儿还在弄ACM的时候写的。