@shixinyi
        
        2017-10-09T10:44:18.000000Z
        字数 1049
        阅读 400
    order
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=12;
int ans[maxn][maxn];
bool h[maxn][maxn],le[maxn][maxn],ge[maxn][maxn],ok=0;
int aa;char cc;
int read() {
aa=0;cc=getchar();
while(cc<'0'||cc>'9') cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
return aa;
}
int get_ge(int x,int y) {
x=(x-1)/3+1;y=(y-1)/3+1;
return (x-1)*3+y;
}
bool kz(int x,int y,int num) {
if(!num) return 0;
int gg=get_ge(x,y);
if(h[x][num]) return 0;
if(le[y][num]) return 0;
if(ge[gg][num]) return 0;
h[x][num]=le[y][num]=ge[gg][num]=1;
return 1;
}
void p() {
ok=1;
for(int i=1;i<=9;++i) {
printf("%d",ans[i][1]);
for(int j=2;j<=9;++j) printf(" %d",ans[i][j]);
printf("\n");
}
}
void s(int x,int y) {
if(x>9) p();
if(ok) return;
int xx,yy;
xx=x;yy=y+1;xx+=yy/10;yy=(yy-1)%9+1;
if(ans[x][y]) s(xx,yy);
else {
for(int i=1;i<=9&&!ok;++i) if(kz(x,y,i)){
ans[x][y]=i; s(xx,yy);
h[x][i]=le[y][i]=ge[get_ge(x,y)][i]=0;
}
ans[x][y]=0;
}
}
int main() {
for(int i=1;i<=9;++i) for(int j=1;j<=9;++j) ans[i][j]=read(),kz(i,j,ans[i][j]);
s(1,1);
return 0;
}