坑点:
1,输入第二组之后的都是先输入哥换行再输入
2,输入每一组数据之后要换行,最后一组不用。
3,太粗心了,多样例的竟然把最重要的初始化忘了。。。
#include <iostream>
#include <cstdio>
#include <string.h>
#include <queue>
#include <vector>
using namespace std;
int v[10][10];
char s[33];
struct node{
int x,y;
node(){}
node(int xx,int yy){
x = xx,y = yy;
}
}num[110];
int cnt = 0;
bool judge(int ii,int jj,int m){
for(int i = 1;i <= 9;i++){
if(v[ii][i] == m || v[i][jj] == m)
return false;
}
int xx = (ii-1) / 3 + 1;
xx *= 3;
int yy = (jj-1) / 3 + 1;
yy *= 3;
for(int i = xx,o = 1;o <= 3;i--,o++){
for(int j = yy,k = 1;k <= 3;j--,k++){
if(m == v[i][j])
return false;
}
}
return true;
}
int flag = 0;
void dfs(int n){
if(flag == 1)
return;
if(n == cnt){
flag = 1;
for(int i = 1;i <= 9;i++){
for(int j = 1;j <= 9;j++){
printf("%d",v[i][j]);
if(j != 9)
printf(" ");
}
puts("");
}
return;
}
int ii = num[n].x,jj = num[n].y;
for(int i = 1;i <= 9;i++){
if(judge(ii,jj,i)){
v[ii][jj] = i;
dfs(n+1);
v[ii][jj] = 0;
}
}
}
int main(){
int t = 0;
while(scanf("%s",s) != EOF){
memset(v,0,sizeof(v));
cnt = 0;
flag = 0;
if(s[0] != '?'){
v[1][1] = s[0] - '0';
}
else{
num[cnt].x = 1,num[cnt++].y = 1;
}
for(int i = 1;i <= 9;i++){
for(int j = 1;j <= 9;j++){
if(i == 1 && j == 1)
continue;
scanf("%s",s);
if(s[0] != '?'){
v[i][j] = s[0] - '0';
}
else{
num[cnt].x = i,num[cnt++].y = j;
}
}
}
if(t++) printf("\n");
dfs(0);
}
}