直接暴力回溯。
struct node{
int x,y;
}p[100];
int cnt;
int g[10][10];
bool ok;
void out(){
int i,j;
for(i=0;i<9;i++){
for(j=0;j<9;j++){
printf("%d",g[i][j]);
}
puts("");
}
}
void dfs(int k){
if(k == cnt){
ok = 1;
out();
return ;
}
int x = p[k].x;
int y = p[k].y;
bool use[11];
memset(use,0,sizeof(use));
int i,j;
for(i=0;i<9;i++){
use[g[x][i]] = 1;
use[g[i][y]] = 1;
}
int s = x/3*3;
int t = y/3*3;
for(i=s;i<s+3;i++){
for(j=t;j<t+3;j++){
use[g[i][j]] = 1;
}
}
for(i=1;i<10 && !ok;i++){
if(use[i])continue;
g[x][y] = i;
dfs(k+1);
}
g[x][y] = 0;//还原
}
int main(){
int n;
scanf("%d",&n);
while(n--){
int i,j;
char ch;
cnt=0;
for(i=0;i<9;i++){
for(j=0;j<9;j++){
cin>>ch;
g[i][j] = ch-'0';
if(ch-'0' == 0){
node tmp;
tmp.x = i;
tmp.y = j;
p[cnt++] = tmp;
}
}
}
ok = 0;
dfs(0);
}
return 0;
}