#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
struct node{
int x,y;}
num[9*9];
int map[9][9],cnt;
char s[55];
bool flagl[9][10],flagr[9][10],shut_down,hehe;
void del(int i)
{
for(int j=0,k=0;s[j];j++)
{
if(s[j]==' ')
continue;
if(s[j]=='?')
num[cnt].x=i,num[cnt++].y=k;
else
{
map[i][k]=s[j]-'0';
flagr[i][s[j]-'0']=true;
flagl[k][s[j]-'0']=true;
}
k++;
}
}
bool check(int pos,int number)
{
int xx=num[pos].x,yy=num[pos].y;
if(flagl[yy][number]||flagr[xx][number])
return false;
int xxx=xx/3*3,yyy=yy/3*3;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
{
if(xxx+i==xx&&yyy+j==yy)
continue;
if(map[xxx+i][yyy+j]==number)
return false;
}
return true;
}
void print()
{
int i,j;
if(hehe)
printf("\n");
hehe=true;
for(i=0;i<9;i++)
{
for(j=0;j<8;j++)
printf("%d ",map[i][j]);
printf("%d\n",map[i][j]);
}
}
void dfs(int k)
{
if(shut_down)
return;
if(k>=cnt)
{
print();
shut_down=true;
return;
}
for(int i=1;i<=9;i++)
{
if(check(k,i))
{
map[num[k].x][num[k].y]=i;
flagr[num[k].x][i]=1;
flagl[num[k].y][i]=1;
dfs(k+1);
flagr[num[k].x][i]=0;
flagl[num[k].y][i]=0;
map[num[k].x][num[k].y]=0;
}
}
}
void init()
{
memset(map,0,sizeof(map));
memset(flagl,0,sizeof(flagl));
memset(flagr,0,sizeof(flagr));
cnt=0;
shut_down=false;
}
int main()
{
while(gets(s)!=NULL)
{
init();
del(0);
for(int i=1;i<9;i++)
{
gets(s);
del(i);
}
dfs(0);
gets(s);
}
return 0;
}
10-02
10-02
10-02