
rt,奖励二选一。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 15;
char g[N][N];
int ans[N][N], can[N][N][N];
char read(){
char c=getchar();
while(c<'0'||c>'9'&&c!='?'){
c=getchar();
}
return c;
}
int get1(int op)
{
if ((op % 3) == 1) return 1;
if ((op % 3) == 2) return 4;
if ((op % 3) == 0) return 7;
}
int get(int x, int y)
{
int cnt = (y + 2) / 3, cnt1 = (x + 2) / 3;
/*if (cnt1 == 1) return cnt;
if (cnt1 == 2) return 3 + cnt;
if (cnt1 == 3) return 6 + cnt;*/
return cnt*3-3+cnt1;
}
void calc(int x, int y)
{
for (int i = 1; i <= 9; i ++ ) if (1 <= (g[x][i] - '0') && (g[x][i] - '0') <= 9 && can[x][y][g[x][i] - '0']) can[x][y][g[x][i] - '0'] = 0,can[x][y][0]--;
for (int i = 1; i <= 9; i ++ ) if (1 <= (g[i][y] - '0') && (g[i][y] - '0') <= 9 && can[x][y][g[i][y] - '0']) can[x][y][g[i][y] - '0'] = 0,can[x][y][0]--;
int op = get(x, y);
for (int i = ((op + 2) / 3 - 1) * 3 + 1; i <= ((op + 2) / 3 - 1) * 3 + 3; i ++ )
for (int j = get1(op); j <= get1(op) + 2; j ++ )
if (1 <= (g[i][j] - '0') && (g[i][j] - '0') <= 9 && can[x][y][g[i][j] - '0']) can[x][y][g[i][j] - '0'] = 0,can[x][y][0]--;
}
void dfs(int left)
{
if (left == 0)
{
for (int i = 1; i <= 9; i ++ )
{
for (int j = 1; j <= 9; j ++ ) printf("%d", ans[i][j]);
puts("");
}
exit(0);
}
int minn = 9, x = -1, y = -1;
for (int i = 1; i <= 9; i ++ )
for (int j = 1; j <= 9; j ++ )
{
if ((1 <= (g[i][j] - '0') && (g[i][j] - '0') <= 9) || ans[i][j]) continue;
int cnt = can[i][j][0];
if (cnt < minn && cnt != 0)
{
minn = cnt;
x = i, y = j;
}
}
if ((x == -1 && y == -1)) return;
int num;
for (int k = 1; k <= 9; k ++ )
if (can[x][y][k])
{
bool fl[N][N];
memset(fl, 0, sizeof fl);
num = k;
for (int i = 1; i <= 9; i ++ )
{
if (can[x][i][num])can[x][i][num]=0,can[x][i][0]--,fl[x][i]=1;
if (can[i][y][num])can[i][y][num]=0,can[i][y][0]--,fl[i][y]=1;
}
int op = get(x, y);
for (int i = ((op + 2) / 3 - 1) * 3 + 1; i <= ((op + 2) / 3 - 1) * 3 + 3; i ++ )
for (int j = get1(op); j <= get1(op) + 2; j ++ )
if(can[i][j][num]) can[i][j][num] = 0,can[i][j][0]--,fl[i][j]=1;
g[x][y] = 48+num;
ans[x][y] = num;
dfs(left - 1);
for (int i = 1; i <= 9; i ++ )
{
for (int j = 1; j <= 9; j ++ ) printf("%d", ans[i][j]);
puts("");
}
puts("");
g[x][y] = '?';
ans[x][y] = 0;
/* for (int i = 1; i <= 9; i ++ )
{
for (int j = 1; j <= 9; j ++ ) printf("%d", ans[i][j]);
puts("");
}
puts("");*/
for (int i = 1; i <= 9; i ++ )
{
if (fl[x][i])can[x][i][num]=1,can[x][i][0]++;
if (fl[i][y])can[i][y][num]=1,can[i][y][0]++;
}
op = get(x, y);
for (int i = ((op + 2) / 3 - 1) * 3 + 1; i <= ((op + 2) / 3 - 1) * 3 + 3; i ++ )
for (int j = get1(op); j <= get1(op) + 2; j ++ )
if(fl[i][j]) can[i][j][num] = 1,can[i][j][0]++;
}
}
int main()
{
for (int i = 1; i <= 9; i ++ )
for (int j = 1; j <= 9; j ++ )
for (int k = 1; k < 10; k ++ )
can[i][j][k] = 1;
int num = 0;
for (int i = 1; i <= 9; i ++ )
for (int j = 1; j <= 9; j ++ )
g[i][j] = read(),can[i][j][0] = 9;
for (int i = 1; i <= 9; i ++ )
for (int j = 1; j <= 9; j ++ )
if (g[i][j] == '?') calc(i, j), num ++ ;
else ans[i][j] = g[i][j] - '0';
dfs(num);
return 0;
}