简单深搜 关键是输入格式问题
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int line[15][15],row[15][15],mark[5][5][15],map[15][15],num;
int leap[100][3];
int dfs(int t)
{
int i;
int a=leap[t][1],b=leap[t][2];
for(i=1;i<=9;i++)
{
if(line[a][i]||row[b][i]||mark[a/3][b/3][i]) continue;
//printf("####\n");
line[a][i]=row[b][i]=mark[a/3][b/3][i]=1;
map[a][b]=i;
if(t==num)
{
return 1;
}
if(!dfs(t+1))
{line[a][i]=row[b][i]=mark[a/3][b/3][i]=0;
map[a][b]=0;}
else return 1;
}
return 0;
}
int main()
{
int a,i,j,d=1;
char p,str[5];
while(~scanf("%s",str))//注意这个输入格式 用%c容易出错
{
memset(mark,0,sizeof(mark));//标记小正方形是否出现过这个数
memset(line,0,sizeof(line));//标记每一行是否出现过这个数
memset(row,0,sizeof(row));//每一列
memset(map,0,sizeof(map));//宫格
int t=0;
num=0;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if(!(i==0&&j==0)) scanf("%s",str);
p=str[0];
if(p>=‘1‘&&p<=‘9‘)
{
map[i][j]=p-‘0‘;
line[i][p-‘0‘]=1;
row[j][p-‘0‘]=1;
mark[i/3][j/3][p-‘0‘]=1;
}
else
{
leap[++t][1]=i;//把所有需要填的数的横纵坐标存在leap数组里
leap[t][2]=j;
num++;
}
}
}
dfs(1);//深搜所有需要填的数
if(d!=1) printf("\n");
d++;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if(j!=0) printf(" ");
printf("%d",map[i][j]);
}
printf("\n");
}
}
return 0;
}