算法學習--數獨遊戲

你一定聽說過“數獨”遊戲。
如【圖1.png】,玩家需要根據9×9盤面上的已知數字,推理出所有剩餘空格的數字,並滿足每一行、每一列、每一個同色九宮內的數字均含1-9,不重複。
在這裏插入圖片描述
數獨的答案都是唯一的,所以,多個解也稱爲無解。
本圖的數字據說是芬蘭數學家花了3個月的時間設計出來的較難的題目。但對會使用計算機編程的你來說,恐怕易如反掌了。
本題的要求就是輸入數獨題目,程序輸出數獨的唯一解。我們保證所有已知數據的格式都是合法的,並且題目有唯一的解。
格式要求,輸入9行,每行9個數字,0代表未知,其它數字爲已知。
輸出9行,每行9個數字表示數獨的解。

例如:
輸入(即圖中題目):
005300000
800000020
070010500
400005300
010070006
003200080
060500009
004000030
000009700

程序應該輸出:
145327698
839654127
672918543
496185372
218473956
753296481
367542819
984761235
521839764

再例如,輸入:
800000000
003600000
070090200
050007000
000045700
000100030
001000068
008500010
090000400

程序應該輸出:
812753649
943682175
675491283
154237896
369845721
287169534
521974368
438526917
796318452


```cpp
//數獨遊戲
#include <iostream>
#include <algorithm>
#include <sstream>
#include <cstring>
#include <string>
#include <vector>
using namespace std;

void show_map(char** map, int row, int col) {
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			cout << map[i][j] << " ";
		}
		cout << endl;
	}
}

//檢查當前座標能不能放數字num
bool canPut(char** map, int num, int x, int y) {
	char ch = num + '0';
	for (int i = 0; i < 9; i++) {
		if (map[x][i] == ch) {//同一行
			return false;
		}
		if (map[i][y] == ch) {//同一列
			return false;
		}
	}
	//同一個九宮格(先根據當前座標找到同一個九宮格的起點)
	int x_begin = (x / 3) * 3;
	int y_begin = (y / 3) * 3;
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			if (map[x_begin + i][y_begin + j] == ch) {
				return false;
			}
		}
	}
	return true;
}

//x,y表示當前座標
void DFS(char** map, int x, int y) {
	if (x == 9) {//遞歸出口
		show_map(map, 9, 9);
		exit(0);
	}
	if (map[x][y] == '0') {
		//1--9
		for (int i = 1; i <= 9; i++) {
			if (canPut(map, i, x, y)) {
				map[x][y] = i + '0';//這裏注意int轉char
				DFS(map, x + (y + 1) / 9, (y + 1) % 9);
			}
		}
		map[x][y] = '0';//回溯(重置)
	}
	else {
		DFS(map, x + (y + 1) / 9, (y + 1) % 9);
	}
}

int main() {
	//輸入處理
	string str_array[9];
	char** map = new char*[9];
	for (int i = 0; i < 9; i++) {
		map[i] = new char[9];
	}
	for (int i = 0; i < 9; i++) {
		cin >> str_array[i];
	}
	//string轉char數組
	for (int i = 0; i < 9; i++) {
		strcpy_s(map[i], str_array[i].length() + 1, str_array[i].c_str());//注意+1表示結束符的位置'\0'
	}
	DFS(map, 0, 0);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章