數獨問題(DFS+回溯)
題目
數獨遊戲的規則是這樣的:在一個9x9的方格中,你需要把數字1-9填寫到空格當中,並且使方格的每一行和每一列中都包含1-9這九個數字。同時還要保證,空格中用粗線劃分成9個3x3的方格也同時包含1-9這九個數字。比如有這樣一個題,大家可以仔細觀察一下,在這裡面每行、每列,以及每個3x3的方格都包含1-9這九個數字。
樣例
Sample Input
7 1 2 ? 6 ? 3 5 8
? 6 5 2 ? 7 1 ? 4
? ? 8 5 1 3 6 7 2
9 2 4 ? 5 6 ? 3 7
5 ? 6 ? ? ? 2 4 1
1 ? 3 7 2 ? 9 ? 5
? ? 1 9 7 5 4 8 6
6 ? 7 8 3 ? 5 1 9
8 5 9 ? 4 ? ? 2 3
Sample Output
7 1 2 4 6 9 3 5 8
3 6 5 2 8 7 1 9 4
4 9 8 5 1 3 6 7 2
9 2 4 1 5 6 8 3 7
5 7 6 3 9 8 2 4 1
1 8 3 7 2 4 9 6 5
2 3 1 9 7 5 4 8 6
6 4 7 8 3 2 5 1 9
8 5 9 6 4 1 7 2 3
程式碼
#include<iostream>
#include <cstring>
#include <algorithm>
using namespace std;
struct node {
int x, y;
};
node arr[105];
char ch;
int Map[10][10];
int N = 0;
bool judge(int num, int x, int y) {
for (int i = 0; i < 9; ++i) {
if (Map[i][y] == num || Map[x][i] == num)
return false;
}
x = x / 3 * 3;
y = y / 3 * 3;
for (int i = x; i < x + 3; ++i) {
for (int j = y; j < y + 3; ++j) {
if (Map[i][j] == num)
return false;
}
}
return true;
}
void dfs(int dept) {
if (dept == N) {
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
if (j == 8)
cout << Map[i][j];
else
cout << Map[i][j] << " ";
}
cout << endl;
}
return;
}
for (int i = 1; i <= 9; ++i) {
if (judge(i, arr[dept].x, arr[dept].y)) {
Map[arr[dept].x][arr[dept].y] = i;
dfs(dept + 1);
Map[arr[dept].x][arr[dept].y] = 0;
}
}
}
int line = 0;
int main() {
while (cin >> ch) {
N = 0;
if (ch == '?') {
Map[0][0] = 0;
arr[N].x = 0;
arr[N].y = 0;
N++;
} else
Map[0][0] = ch - '0';
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
if (i == 0 && j == 0)
continue;
cin >> ch;
if (ch == '?') {
Map[i][j] = 0;
arr[N].x = i;
arr[N].y = j;
N++;
} else
Map[i][j] = ch - '0';
}
}
if (line++)
cout << endl;
dfs(0);
}
return 0;
}
相關文章
- 回溯問題
- 回溯法求迷宮問題
- 回溯問題Python框架總結——排列組合問題Python框架
- poj 1321 棋盤問題 回溯 JavaJava
- leetcode37 解數獨問題 hardLeetCode
- 【力扣】排列問題(回溯法)(去重)力扣
- 從八皇后問題到回溯演算法演算法
- 回溯法解決全排列問題總結
- CF774A. Hongcow Builds A Nation 題解 簡單dfs+組合計數GCUI
- 回溯法(排列樹)解決八(N)皇后問題
- 【LeetCode回溯演算法#07】子集問題I+II,鞏固解題模板並詳解回溯演算法中的去重問題LeetCode演算法
- Java處理正則匹配卡死(正則回溯問題)Java
- leetcode.回溯演算法能解決什麼問題?LeetCode演算法
- n皇后問題--回溯法,以DFS的方式搜尋
- 第七章 遞迴、DFS、剪枝、回溯等問題 ------------- 7.5 “逐步生成結果”之非數值型問題 (合法括號)遞迴
- 【LeetCode回溯演算法#08】遞增子序列,鞏固回溯演算法中的去重問題LeetCode演算法
- 【原創】視訊+文字:詳解VBA解決數獨問題
- 回溯和遞迴實現迷宮問題(C語言)遞迴C語言
- c++迷宮問題回溯法遞迴演算法C++遞迴演算法
- 第七章 遞迴、DFS、剪枝、回溯等問題 ------------- 7.3 題解:機器人走方格問題遞迴機器人
- 第七章 遞迴、DFS、剪枝、回溯等問題 ------------- 7.4 硬幣表示某個給定數值遞迴
- 單獨補題-數正方形
- 最大數問題
- [Leetcode]827.使用回溯+標記解決最大人工島問題LeetCode
- 刷題總結——回溯演算法演算法
- leetcode題解(遞迴和回溯法)LeetCode遞迴
- #數位DP 計數問題
- 雙模數問題 題解
- 組合數問題
- 迴文數問題
- 回溯演算法求解橋本分數式演算法
- P1433 吃乳酪 (dfs+剪枝)
- hdu 6446 Tree and Permutation(dfs+思維)
- 回溯
- ”回溯演算法“框架及練習題演算法框架
- 網路效能監控與流量回溯分析 - 輕鬆診斷網路問題
- 回溯演算法 | 追憶那些年曾難倒我們的八皇后問題演算法
- 3. 工作分配問題(回溯法)設有n件工作分配給n個人。。。