题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1426
/****************************
第一次做数独问题,没做之前觉得就是一个搜索题,然而写起代码来就错误重重了!
问号的输入我用了字符串接收(%s),详见代码。
dfs。深搜即可
在提交题目时注意,不同的示例之间空一行。最后结束前的一组后面没有空行。
我的代码提交时间是889MS,效率欠佳。
/******************************************
代码如下:
/*****************
#include<stdio.h>
int map[10][10];
int w[88];//记录问号位置
int e; //记录问号个数
int myscanf()//矩阵的输入
{
e=0;
char x[3];
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
{
if(scanf("%s",x)==EOF)
return 0;
if(x[0]!='?')
{
map[i][j]=x[0]-'0';
}
else
{
map[i][j]=0;//代表问号
w[e++]=i*10+j;
}
}
return 1;
}
void output()
{
for(int i=1;i<=9;i++)
{
for(int j=1;j<=8;j++)
{
printf("%d ",map[i][j]);
}
printf("%d\n",map[i][9]);
}
}
int ok(int a,int b,int k)//检查k能否填在位置ab
{
for(int i=1;i<=9;i++)//检查行
{
if(k==map[a][i])return 0;
}
for(int i=1;i<=9;i++)//检查列
{
if(k==map[i][b])return 0;
}
a=(a-1)/3*3+1;
b=(b-1)/3*3+1;
for(int i=a;i<=a+2;i++)//检查小九宫格
{
for(int j=b;j<=b+2;j++)
{
if(k==map[i][j])return 0;
}
}
return 1;
}
void dfs(int a)//w[a]的十位数和个位数代表位置
{
int k=w[a]/10,l=w[a]%10;
if(a==e)//全填完了
{
output();
return;
}
//填数
for(int i=1;i<=9;i++)//把i填进去
{
if(ok(k,l,i))//i可以填在此处
{
map[k][l]=i;
dfs(a+1);
map[k][l]=0;
}
}
}
int main()
{
int flag=0;
while(myscanf())//矩阵输入
{
if(flag++)
puts("");//空行的输出
dfs(0);
}
return 0;
}