数独(dfs思想)

题目描述

蒜头君今天突然开始还念童年了,想回忆回忆童年。他记得自己小时候,有一个很火的游戏叫做数独。便开始来了一局紧张而又刺激的高阶数独。蒜头君做完发现没有正解,不知道对不对? 不知道聪明的你能否给出一个标准答案?标准数独是由一个给与了提示数字的 9×9 网格组成,我们只需将其空格填上数字,使得每一行,每一列以及每一个 3×3 宫都没有重复的数字出现。

把上面的 * 替换成 1−9 就可以了
提醒:两个数字之间要有一个空格,其他地方不要输出多余的符号。
本题答案不唯一,符合要求的答案均正确
在这里插入图片描述
样例1:
输入:
在这里插入图片描述
输出:
在这里插入图片描述

分析:用dfs思想去一个空一个空的尝试,将行,列,小格子里面的数用数组装起来方便检测是否有重复的数字,而且这里在输出的控制上也是有一定技巧的(避免了下一次回溯对当前输出造成的影响)

#include<cstdio>
char mp[10][10];
bool tx[10][10],ty[10][10],tg[10][10];//分别记录每行,每列,每个方格中出现的数字
bool f;
void dfs(int x,int y){
	if(f){
		return;
	}
	if(x==9){
		f=true;
		for(int i=0;i<9;i++){//输出地图,避免回溯造成影响
			for(int j=0;j<9;j++){
				printf(" %c",mp[i][j]);
				if(j==8)printf("\n");//处理行末空格
				else
				printf(" ");
			}
			
		}
		return;
	}
	if(y==9){//一行填满切到下一行
		dfs(x+1,0);
		return;
	} 
	if(mp[x][y]!='*'){//不能填的位置直接跳过
		dfs(x,y+1);
		return;
	}
	for(int i=1;i<=9;i++){//尝试9个数
		if(!tx[x][i]&&!ty[y][i]&&!tg[x/3*3+y/3][i]){
			tx[x][i]=true;
			ty[y][i]=true;
			tg[x/3*3+y/3][i]=true;
			mp[x][y]=i+'0';
			dfs(x,y+1);//填下一个数
			tx[x][i]=false;
			ty[y][i]=false;
			tg[x/3*3+y/3][i]=false;
			mp[x][y]='*';
		}
	}
	
} 
int main(){
	for(int i=0;i<9;i++){//输入地图 
		for(int j=0;j<9;j++){
			scanf(" %c",&mp[i][j]);//这个地方用printf必须在前面加空格,吃掉前面输入的空格,如果是cin就不需要 
		}
	}
	for(int i=0;i<9;i++){
		for(int j=0;j<9;j++){
			if(mp[i][j]!='*'){
				tx[i][mp[i][j]-'0']=true;//这一行出现了这个数
				ty[j][mp[i][j]-'0']=true;//这一列出现了这个数
				tg[i/3*3+j/3][mp[i][j]-'0']=true;//这个方格出现了这个数 
			}
		} 
	} 
	dfs(0,0);//从mp[0][0]这个位置开始填数; 
	return 0;
} 

运行结果:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章