题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1426
|
解题思路:
1.需要学会的是输入的问题,具体看代码
2.先定义一个结构体,里面包括x和y,再用这个结构体定义一个数组,在输入的时候,如果是“?”,则把这个坐标存到数组里面(个人认为这是特别巧妙地一点)
3.写一个check函数,可以用来判断填某个数时,同行同列和同一个小九宫格有没有重复的
4.写一个深搜dfs()函数,如果都填完了,那就打印出来(注意输出格式);如果没填完,那就把1-9一个一个填入,开始深搜。
代码:
#include<iostream>
using namespace std;
struct dd
{
int x;
int y;
}a[100];//用来存储要填位置的坐标
int map[10][10];//用来存储数独上的数,如果是“?”,则为0
int num;//用来统计有多少个需要填的数
int check(int k,int step)//k代表要判断的数,step代表第几个需要填的数
{
int i,j,p,q;
for(i=0;i<9;i++)//判断同行和同列有没有重复的
if(map[a[step].x][i]==k||map[i][a[step].y]==k)
return 0;
p=(a[step].x/3)*3;
q=(a[step].y/3)*3;//可以想想这两行是为啥
for(i=p;i<p+3;i++)//判断一个3*3的方格有没有重复的
for(j=q;j<q+3;j++)
if(map[i][j]==k)
return 0;
return 1;
}
void dfs(int step)
{
int i,j;
if(num==step)//所有的都已经填好了
{
for(i=0;i<9;i++)//打印出来,注意输出格式
{
for(j=0;j<8;j++)
cout<<map[i][j]<<" ";
cout<<map[i][8]<<endl;
}
return ;
}
for(i=1;i<=9;i++)//1-9一一判断是否能填进去
{
if(check(i,step)==1)//i可以填进去
{
map[a[step].x][a[step].y]=i;//把i填进去
dfs(step+1);
map[a[step].x][a[step].y]=0;//还原
}
}
return ;
}
int main()
{
int i,j,t=0;
char s;
while(cin>>s)
{
num=0;
if(s=='?')
{
a[num].x=0;
a[num].y=0;//因为第一个“?”的坐标是(0,0)
num++;
map[0][0]=0;
}
else
map[0][0]=s-'0';
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if(i==0&&j==0)
continue;
else
{
cin>>s;
if(s=='?')
{
a[num].x=i;
a[num].y=j;
num++;
map[i][j]=0;
}
else
map[i][j]=s-'0';
}
}
}
if(t++)
cout<<endl;//控制换行
dfs(0);//从第一个开始
}
return 0;
}
既然看到底了,何不给俺点个赞再走呢!!!