//stone_juice P1784 数独
#include <bits/stdc++.h>//华丽的开头~
using namespace std;
int sd[11][11];//数独方阵定义
bool p[11][11],l[11][11],fz[11][11];//行(排?),列,方阵。
void _out()//优美地输出~
{
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
cout<<sd[i][j]<<" ";
cout<<endl;
}
exit(0);//注意,此处要用exit(0)。用return的话不会退出dfs函数,会增加运算量。
}
void dfs(int x,int y)//神奇的深搜~
{
if(sd[x][y]!=0)//如果原来这个位置有数字,跳过。
if(x==9&&y==9)_out();//当行列都为9,填充完成,输出~
else if(y==9)dfs(x+1,1);//当列数为9,搜索下一排。
else dfs(x,y+1);//搜下一列啦~
else//原来的地方没有数字,准备填充!
for(int i=1;i<=9;i++)
if((!p[x][i])&&(!l[y][i])&&(!fz[(x-1)/3*3+(y-1)/3+1][i]))
//判断是不是重复了。方法题解有讲!
{
sd[x][y]=i;//填充!
p[x][i]=l[y][i]=fz[(x-1)/3*3+(y-1)/3+1][i]=true;//打上标记。
if(x==9&&y==9)_out();//全部填完!输出~
else if(y==9)dfs(x+1,1);//同上!搜下一行。
else dfs(x,y+1);//搜下一列!
sd[x][y]=0; //恢复标记。
p[x][i]=l[y][i]=fz[(x-1)/3*3+(y-1)/3+1][i]=false;//恢复标记。
}
}
int main()
{
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
{
int t;//定义tmp(防止下面代码太长?)
cin>>t;//炫酷地输入
if(t!=0)
p[i][t]=l[j][t]=fz[(i-1)/3*3+(j-1)/3+1][t]=true;
//填充的不是0的话,表示原来有数字了。打上标记。
sd[i][j]=t;//填充进数独。
}
dfs(1,1);//搜搜搜!
return 0;//完美地结束~
}
为什么在dfs最后要消除标记