數獨遊戲-DFS

歡迎去ZJYYCOJ試試
文章首發於

題目

芬蘭數學家因卡拉,花費3個月時間設計出了世界上迄今難度最大的數獨遊戲,而且它只有一個答案。因卡拉說只有思考能力最快、頭腦最聰明的人才能破解這個遊戲。這是英國《每日郵報》2012年6月30日的一篇報道。
作爲Acmer的你,能寫一個程序解決所有的數獨問題嗎?

世界上迄今難度最大的數獨遊戲:

在這裏插入圖片描述

輸入

本題包含多組測試。每組測試會給你一個 9*9 的矩陣,同一行相鄰的兩個元素用一個空格分開。其中1-9代表該位置的已經填好的數,問號(?)表示需要你填的數。

輸出

對於每組測試,請輸出它的解,同一行相鄰的兩個數用一個空格分開。兩組解之間要一個空行。 如果有多種答案,輸出任意一種即可!

輸入樣例

? 2 6 7 ? ? 5 1 8
7 3 1 ? 5 8 6 2 4
5 4 ? 2 6 1 3 9 7
6 ? 4 3 7 ? ? 8 1
2 8 7 1 9 6 4 3 5
1 9 ? ? 8 4 7 6 2
3 7 ? 8 ? 9 1 4 6
8 ? 9 4 1 5 2 7 3
? 1 2 6 3 7 8 5 9
? 2 6 7 ? ? 5 1 8
7 3 1 ? 5 8 6 2 4
5 4 ? 2 6 1 3 9 7
6 ? 4 3 7 ? ? 8 1
2 8 7 1 9 6 4 3 5
1 9 ? ? 8 4 7 6 2
3 7 ? 8 ? 9 1 4 6
8 ? 9 4 1 5 2 7 3
? 1 2 6 3 7 8 5 9

輸出樣例

9 2 6 7 4 3 5 1 8
7 3 1 9 5 8 6 2 4
5 4 8 2 6 1 3 9 7
6 5 4 3 7 2 9 8 1
2 8 7 1 9 6 4 3 5
1 9 3 5 8 4 7 6 2
3 7 5 8 2 9 1 4 6
8 6 9 4 1 5 2 7 3
4 1 2 6 3 7 8 5 9

9 2 6 7 4 3 5 1 8
7 3 1 9 5 8 6 2 4
5 4 8 2 6 1 3 9 7
6 5 4 3 7 2 9 8 1
2 8 7 1 9 6 4 3 5
1 9 3 5 8 4 7 6 2
3 7 5 8 2 9 1 4 6
8 6 9 4 1 5 2 7 3
4 1 2 6 3 7 8 5 9

代碼

#include<bits/stdc++.h>
using namespace std;
int m,a,b,sum,flag;
char Map[20][20],n; //存放數獨
void print(){
	for(int i=0;i<9;i++){
		for(int j=0;j<9;j++){
			if(j==0)
				printf("%c",Map[i][j]);
			else
				printf(" %c",Map[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}
bool check(int x,int y,char k){
	for(int i=0;i<9;i++){       //橫豎直線
		if(Map[i][y]==k||Map[x][i]==k)
			return false;
	}
	int x1=x/3*3;		//3*3小矩形 
	int y1=y/3*3;
	for(int i=x1;i<x1+3;i++){
		for(int j=y1;j<y1+3;j++){
			if(Map[i][j]==k){
				return false;
			}
		}
	}
	return true;
}
void dfs(int x,int y){
	if(x==9&&y==0){
		flag=1;
		print();
		return;
	}
	if(Map[x][y]!='?'){
		if(y==8)
			dfs(x+1,0);
		else
			dfs(x,y+1);
	}
	else{
		for(int i=1;i<=9;i++){
			if(check(x,y,i+'0')){
				Map[x][y]=i+'0';
				if(y==8){
					dfs(x+1,0);
				}
				else{
					dfs(x,y+1);
				}
				if(flag==1)
					return;
				Map[x][y]='?';
			}
		}
	}
}
int main(){
	while(cin>>n){
		Map[0][0]=n;
		for(int i=0;i<9;i++){
			for(int j=0;j<9;j++){
				if(i==0&&j==0){
					continue;
				}
				cin>>Map[i][j];
			}
		}
		flag=0;
		dfs(0,0);
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章