题目上说有唯一解...按照他说的用唯一解来写 超时啊
//运行代码后面的样例时
//最后18个空位产生死循环
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int mp[10][10],T[10]={0,1,1,1,2,2,2,3,3,3};
int N; //N个空需要填
struct point{
int x,y;
bool success;
}P[90];
int Flag; //flag==1时 代表有多种情况 ,任取一种可能
int Find(point X)
{
int i,j,k,num;
bool flag[10];
memset(flag,0,sizeof(flag));
for(i=1;i<=9;i++)
flag[mp[i][X.y]]=1;
for(j=1;j<=9;j++)
flag[mp[X.x][j]]=1;
for(i=1;i<=3;i++)
for(j=1;j<=3;j++)
flag[mp[3*(T[X.x]-1)+i][3*(T[X.y]-1)+j]]=1;
num=0;
for(i=1;i<=9;i++)
if(flag[i]==0){
k=i;
num++;
}
// printf("%d\n",num);
// printf("\t %d %d\n",X.x,X.y);
// for(i=1;i<=9;i++) printf("%d ",flag[i]);printf(" ");system("pause");
if(num==1){ //如果该点只有一种情况 那就填入
mp[X.x][X.y]=k;
return k;
}
if(Flag){ //处理死循环
for(i=1;i<=9;i++){
if(flag[i]==0){ //第一个可行数
mp[X.x][X.y]=i;
Flag=0; //死循环解除
return i;
}
}
}
return -1;
}
int main()
{
int i,j,k,line=0;
char s[10];
while(scanf("%s",s)!=EOF)
{
N=0;
if(s[0]=='?') mp[1][1]=0;
else mp[1][1]=s[0]-'0';
for(i=2;i<=9;i++){
scanf("%s",s);
if(s[0]=='?') mp[1][i]=0;
else mp[1][i]=s[0]-'0';
}
for(i=2;i<=9;i++)
for(j=1;j<=9;j++)
{
scanf("%s",s);
if(s[0]=='?') mp[i][j]=0;
else mp[i][j]=s[0]-'0';
}
/*
for(printf("\n"),i=1;i<=9;i++,printf("\n"))
for(j=1;j<=9;j++)
printf("%d ",mp[i][j]);
*/
for(i=1;i<=9;i++){
for(j=1;j<=9;j++){
if(mp[i][j]==0){
N++;
P[N].x=i;P[N].y=j;
P[N].success=0;
}
}
}
int M=N;
j=M; //填数不成功的个数
while(M){
j=M;
for(i=1;i<=N;i++)
{
if(P[i].success==0)
{
k=Find(P[i]);
if(k>0)
{
M--;
P[i].success=1;
i=0;
}
}
}//printf("%d %d %d \n",j,M,Flag);
if(j==M) Flag=1;
}
if(line==0){
line=1;
}
else printf("\n");
for(i=1;i<=9;i++,printf("\n"))
for(j=1;j<=9;j++)
printf("%d ",mp[i][j]);
}
return 0;
}
/*
? ? ? 5 ? 3 9 2 7
4 2 5 9 ? ? ? 1 ?
? 9 3 ? ? 2 ? 8 4
2 7 ? ? 3 ? 8 9 ?
? 6 9 7 ? 8 ? 4 ?
3 1 8 4 ? 9 ? ? ?
? 4 7 ? 5 1 ? ? 8
1 ? 2 ? 7 ? 4 ? 9
? 3 6 2 9 4 ? ? ?
*/
加上dfs之后 可以处理有多种结果的样例
//产生死循环后就换dfs搜索
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int mp[10][10],T[10]={0,1,1,1,2,2,2,3,3,3};
bool flag[10];
int N,M; //N个空需要填,M个空组成死循环
struct point{
int x,y;
bool success;
}P[90];
int Flag; //flag==1时 代表有多种情况 ,任取一种可能
void FLAG(point X,bool flag[]) //求取值表flag[]
{
int i,j;
memset(flag,0,sizeof(flag));
for(i=1;i<=9;i++)
flag[mp[i][X.y]]=1;
for(j=1;j<=9;j++)
flag[mp[X.x][j]]=1;
for(i=1;i<=3;i++)
for(j=1;j<=3;j++)
flag[mp[3*(T[X.x]-1)+i][3*(T[X.y]-1)+j]]=1;
}
int Find(point X)
{
int i,j,k,num;
bool flag[10];memset(flag,0,sizeof(flag));
FLAG(X,flag);
num=0;
for(i=1;i<=9;i++)
if(flag[i]==0){
k=i;
num++;
}
// printf("%d\n",num);
// printf("\t %d %d\n",X.x,X.y);
// for(i=1;i<=9;i++) printf("%d ",flag[i]);printf(" %d",M);system("pause");
if(num==1){ //如果该点只有一种情况 那就填入
mp[X.x][X.y]=k;
return k;
}
if(Flag){ //处理死循环
for(i=1;i<=9;i++){
if(flag[i]==0){ //第一个可行数
mp[X.x][X.y]=i;
Flag=0; //死循环解除
return i;
}
}
}
return -1;
}
int dfs(int n)
{
if(n==M+1) return 1;
int i,j,k;
bool flag[10];memset(flag,0,sizeof(flag));
FLAG(P[n],flag);
for(i=1;i<=9;i++)
{
if(flag[i]==0){
mp[P[n].x][P[n].y]=i;
if(dfs(n+1)) return 1;
flag[i]=1;
mp[P[n].x][P[n].y]=0;
}
}
return 0;
}
int main()
{
int i,j,k,line=0;
char s[10];
while(scanf("%s",s)!=EOF)
{
N=0;
if(s[0]=='?') mp[1][1]=0;
else mp[1][1]=s[0]-'0';
for(i=2;i<=9;i++){
scanf("%s",s);
if(s[0]=='?') mp[1][i]=0;
else mp[1][i]=s[0]-'0';
}
for(i=2;i<=9;i++)
for(j=1;j<=9;j++)
{
scanf("%s",s);
if(s[0]=='?') mp[i][j]=0;
else mp[i][j]=s[0]-'0';
}
/*
for(printf("\n"),i=1;i<=9;i++,printf("\n"))
for(j=1;j<=9;j++)
printf("%d ",mp[i][j]);
*/
for(i=1;i<=9;i++){
for(j=1;j<=9;j++){
if(mp[i][j]==0){
N++;
P[N].x=i;P[N].y=j;
P[N].success=0;
}
}
}
M=N;
j=M; //填数不成功的个数
while(M){
j=M;
for(i=1;i<=N;i++)
{
if(P[i].success==0)
{
k=Find(P[i]);
if(k>0)
{
M--;
P[i].success=1;
i=0;
}
}
}//printf("%d %d %d \n",j,M,Flag);
if(j==M){
int m=0;
for(i=1;i<=N;i++)
if(P[i].success==0)
{
P[++m]=P[i];
if(m==M) break;
}
dfs(1);M=0;
}
}
if(line==0){
line=1;
}
else printf("\n");
for(i=1;i<=9;i++,printf("\n"))
{
printf("%d",mp[i][1]);
for(j=2;j<=9;j++)
printf(" %d",mp[i][j]);
}
}
return 0;
}
/*
? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ?
? ? ? ? ? ? 1 ? ?
*/
直接用dfs
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int mp[10][10],T[10]={0,1,1,1,2,2,2,3,3,3};
int N;
struct point{
int x,y;
bool success;
}P[90];
void FLAG(point X,bool flag[])
{
int i,j;
memset(flag,0,sizeof(flag));
for(i=1;i<=9;i++)
flag[mp[i][X.y]]=1;
for(j=1;j<=9;j++)
flag[mp[X.x][j]]=1;
for(i=1;i<=3;i++)
for(j=1;j<=3;j++)
flag[mp[3*(T[X.x]-1)+i][3*(T[X.y]-1)+j]]=1;
}
int dfs(int n)
{
if(n==N+1) return 1;
int i,j,k;
bool flag[10];memset(flag,0,sizeof(flag));
FLAG(P[n],flag);
for(i=1;i<=9;i++)
if(flag[i]==0){
mp[P[n].x][P[n].y]=i;
if(dfs(n+1)) return 1;
flag[i]=1;
mp[P[n].x][P[n].y]=0;
}
return 0;
}
int main()
{
int i,j,k,line=0;
char s[10];
while(scanf("%s",s)!=EOF)
{
N=0;
if(s[0]=='?') mp[1][1]=0;
else mp[1][1]=s[0]-'0';
for(i=2;i<=9;i++){
scanf("%s",s);
if(s[0]=='?') mp[1][i]=0;
else mp[1][i]=s[0]-'0';
}
for(i=2;i<=9;i++)
for(j=1;j<=9;j++)
{
scanf("%s",s);
if(s[0]=='?') mp[i][j]=0;
else mp[i][j]=s[0]-'0';
}
for(i=1;i<=9;i++)
for(j=1;j<=9;j++)
if(mp[i][j]==0){
N++;
P[N].x=i;P[N].y=j;
P[N].success=0;
}
dfs(1);
if(line==0) line=1;
else printf("\n");
for(i=1;i<=9;i++,printf("\n"))
{
printf("%d",mp[i][1]);
for(j=2;j<=9;j++)
printf(" %d",mp[i][j]);
}
}
return 0;
}