不懂就问
  • 板块P1784 数独
  • 楼主aaaaaaaawsl
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/7/16 18:29
  • 上次更新2023/11/4 14:34:26
查看原帖
不懂就问
307940
aaaaaaaawsl楼主2021/7/16 18:29
//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最后要消除标记

2021/7/16 18:29
加载中...