1. 程式人生 > >數獨:dfs+剪枝+位運算+排除冗余+優化搜索順序(未完)

數獨:dfs+剪枝+位運算+排除冗余+優化搜索順序(未完)

main esp 測試用例 brush 數獨 方案 include blank \n

和藍橋杯以前一個題一樣,但是數據加強了,博主水平有限,沒做出來,先在這裏記錄一下,這裏正解,下面是博主的超時做法。最近準備考研,不能深入學習了。

題目描述

數獨是一種傳統益智遊戲,你需要把一個9 × 9的數獨補充完整,使得圖中每行、每列、每個3 × 3的九宮格內數字1~9均恰好出現一次。

請編寫一個程序填寫數獨。

技術分享圖片

輸入格式
輸入包含多組測試用例。

每個測試用例占一行,包含81個字符,代表數獨的81個格內數據(順序總體由上到下,同行由左到右)。

每個字符都是一個數字(1-9)或一個”.”(表示尚未填充)。

您可以假設輸入中的每個謎題都只有一個解決方案。

文件結尾處為包含單詞“end”的單行,表示輸入結束。

輸出格式
每個測試用例,輸出一行數據,代表填充完全後的數獨。

樣例

輸入樣例:
.2738..1..1...6735.......293.5692.8...........6.1745.364.......9518...7..8..6534.
......52..8.4......3...9...5.1...6..2..7........3.....6...1..........7.4.......3.
end
輸出樣例:
527389416819426735436751829375692184194538267268174593643217958951843672782965341
416837529982465371735129468571298643293746185864351297647913852359682714128574936


#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int m[10][10],kx[10][10],ky[10][10],kk[10][10];		//kx:行 ky:列 kk:方格
int ans;


void dfs(int x, int y) {
	if (ans)return;
	if (x == 9) {
		ans = 1;
		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++)
				cout << m[i][j];
		}
		cout << "\n";
	}
	if (m[x][y] == 0) {
		for (int i = 1; i < 10; i++) {
			if (kx[x][i]==0&&ky[y][i]==0&& kk[3 * (x / 3) + (y / 3)][i]==0) {

				kx[x][i] = 1;
				ky[y][i] = 1;
				kk[3 * (x/3) + (y/3)][i] = 1;
				m[x][y] = i;
				
				if (y == 8)dfs(x + 1,0);
				else dfs(x, y + 1);

				kx[x][i] = 0;
				ky[y][i] = 0;
				kk[3 * (x / 3) + (y / 3)][i] = 0;
				m[x][y] = 0;
			}
		}
		return;
	}
	else {
		if (y == 8)dfs(x + 1, 1);
		else dfs(x, y + 1);
	}
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	string a;
	while (cin >> a&&a[0] != ‘e‘) {
		memset(m, 0, sizeof(m));
		memset(kx, 0, sizeof(kx));
		memset(ky, 0, sizeof(ky));
		memset(kk, 0, sizeof(kk));
		ans = 0;
		int len = a.size();
		for (int i = 0; i < len; i++)
		{
			if (a[i] != ‘.‘) {
				m[i / 9][i % 9] = a[i] - ‘0‘;		//終於把地圖做好了。。
				kx[i / 9][a[i] - ‘0‘] = 1;
				ky[i % 9][a[i] - ‘0‘] = 1;
				kk[3 * (i / 9 / 3) + (i % 9 / 3)][a[i] - ‘0‘] = 1;		//初始化
			}
		}
		dfs(0, 0);
	}
	return 0;
}

  

 

數獨:dfs+剪枝+位運算+排除冗余+優化搜索順序(未完)