數獨(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;
} 

運行結果:
在這裏插入圖片描述

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