搜索好题,枚举每个位置的数字,没了。。。记得从9,9->1,1不然会T?
代码
//By AcerMo
#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int M=20;
bool flag=0;
int map[M][M];
char a[M][M];
bool h[M][M],l[M][M],n[M][M];
void coutt()
{
for (int i=1;i<=9;i++)
{
for (int k=1;k<=9;k++)
cout<<map[i][k];puts("");
}
return ;
}
void dfs(int x,int y)
{
if (flag) return ;
if (map[x][y]!=0)
{
if (x==1&&y==1) return (void)(flag=1);
else if (y==1) dfs(x-1,9);
else dfs(x,y-1);
}
if (map[x][y]==0)
for (int i=1;i<=9;i++)
if (h[x][i]&&l[y][i]&&n[(x-1)/3*3+(y-1)/3+1][i])
{
if (flag) return ;
map[x][y]=i;
h[x][i]=l[y][i]=n[(x-1)/3*3+(y-1)/3+1][i]=0;
if (x==1&&y==1) return (void)(flag=1);
else if (y==1) dfs(x-1,9);
else dfs(x,y-1);
if (flag) return ;
map[x][y]=0;
h[x][i]=l[y][i]=n[(x-1)/3*3+(y-1)/3+1][i]=1;
}
return ;
}
int main()
{
int t;scanf("%d",&t);
while (t--)
{
memset(map,0,sizeof(map));
memset(h,1,sizeof(h));
memset(l,1,sizeof(l));
memset(n,1,sizeof(n));flag=0;
for (int i=1;i<=9;i++) scanf("%s",a[i]+1);
for (int i=1;i<=9;i++)
for (int k=1;k<=9;k++)
{
if (a[i][k]-'0'>0)
{
map[i][k]=a[i][k]-'0';
h[i][map[i][k]]=l[k][map[i][k]]=0;
n[(i-1)/3*3+(k-1)/3+1][map[i][k]]=0;
}
}
dfs(9,9);if (flag) coutt();else puts("");
}
return 0;
}