裸dfs,输入姿势对了才能过
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int N = 9;
int maps[N][N];
int visr[N][N+1];
int visc[N][N+1];
int visf[N][N][N+1];
int blank[N*N];
int flag = 0;
int num;
void dfs(int cur)
{
int x = blank[cur]/N,y = blank[cur]%N;
if(cur == num){
flag = 1;
for(int i = 0;i<N;i++){
for(int j = 0;j<N;j++){
if(j == 0)printf("%d",maps[i][j]);
else printf(" %d",maps[i][j]);
}
printf("\n");
}
return;
}
for(int i = 1;i<=9;i++){///放哪个数
if(!visr[x][i] && !visc[y][i] && !visf[x/3][y/3][i]){
maps[x][y] = i;
visr[x][i] = 1;
visc[y][i] = 1;
visf[x/3][y/3][i] = 1;
dfs(cur+1);
visr[x][i] = 0;
visc[y][i] = 0;
visf[x/3][y/3][i] = 0;
}
}
}
int main()
{
char s[2];
//freopen("in.txt","r",stdin);
while(scanf("%s",s) != EOF){
num = 0;
int tt;
memset(visr,0,sizeof(visr));
memset(visc,0,sizeof(visc));
memset(visf,0,sizeof(visf));
if(s[0] == '?'){blank[num++] = 0;}
else {
tt = s[0] - '0';
maps[0][0] = tt;
visr[0][tt] = visc[0][tt] = visf[0][0][tt] = 1;
}
for(int i = 0;i<N;i++){
for(int j = 0;j<N;j++){
if(i == 0 && j == 0)continue;
scanf("%s",s);
if(s[0] == '?'){
blank[num++] = i*N + j;
}
else {
tt = s[0] - '0';
maps[i][j] = tt;visr[i][tt] = visc[j][tt] = visf[i/3][j/3][tt] = 1;
}
}
}
if(flag)printf("\n");
dfs(0);
}
return 0;
}