C++ 數獨遊戲

C++ 數獨遊戲

直接上代碼:

// 數獨 sudoku 

#include <iostream>

using namespace std;

int P[9][9];
bool flag = false;

// 處理輸入 
void input(){
	char t;
	cout << "輸入棋盤,空用 0 表示\n";
	for(int i = 0; i < 9; i ++){
		for(int j = 0; j < 9; j ++){
			cin >> t;
			P[i][j] = t - '0';
		}
	}
}

// 處理輸出 
void output(){
	for(int i = 0; i < 9; i ++){
		for(int j = 0; j < 9; j ++){
			
			if(P[i][j]){
				cout << P[i][j];	
			}else{
				cout << " ";
			}
			
			if(j%3 == 2) cout << "  ";
		}
		if(i%3 == 2) cout << endl;
		cout << endl;
	}
	
}

// 判斷即將放入的 是否符合條件 
bool check(int n, int num){
	
	// 行 
	for(int i = 0; i < 9; i ++){
		if(P[n/9][i] == num){
			return false;
		}
	} 
	
	// 列 
	for(int i = 0; i < 9; i ++){
		if(P[i][n%9] == num){
			return false;
		}
	} 
	
	// 宮
    int x = n / 9 / 3 * 3;
    int y = n % 9 / 3 * 3;
    for(int i = 0; i < 3; i ++){
    	for(int j = 0; j < 3; j ++){
    		if(P[x+i][y+j] == num){
    			return false;
    		}
    	}
    } 
    
    return true;
}

// [n/9][n%9]
void dfs(int n){
	
	// 成功 
	if(n > 80){
		flag = true;
		return;
	}
	
	int x = n/9, y = n%9;
	// 有值 跳過 
	if(P[x][y]){
		dfs(n+1);
		return;
	}
	// 遍歷 
	for(int i = 1; i <= 9; i ++){
		// 判斷 
		if(check(n, i)){
			// 判斷成功 賦值 
			P[x][y] = i;
			dfs(n+1);
			// 退出時判斷是否完成  完成時退出 
			if(flag){
				return;
			}
			// 未完成 重置棋盤 
			P[x][y] = 0;
		}
	}
}

int main(){
	input();
	cout << endl << endl; 
	dfs(0);
	output();
	return 0;
} 


/*

測試用例 

170004000
360810054
008050109
007035048
000000270
000008601
000060080
700000000
000403016

*/

測試用例子結果

在這裏插入圖片描述

百度百科 世界最難數獨

答案秒出, 沒有什麼是暴力解決不了的~
在這裏插入圖片描述

楠少博客同步更新:https://blog.nanshaobit.top/95

發佈了19 篇原創文章 · 獲贊 5 · 訪問量 4857
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章