题目
数独是一种传统益智游戏,你需要把一个 的数独补充完整,使得图中每行、每列、每个 的九宫格内数字 均恰好出现一次。
请编写一个程序填写数独。
输入格式
输入共 行,每行包含一个长度为 的字符串,用来表示数独矩阵。
其中的每个字符都是 或 (表示尚未填充)。
输出格式
输出补全后的数独矩阵。
数据保证有唯一解。
输入样例:
.2738..1.
.1...6735
.......29
3.5692.8.
.........
.6.1745.3
64.......
9518...7.
.8..6534.
输出样例:
527389416
819426735
436751829
375692184
194538267
268174593
643217958
951843672
782965341
题解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #include <iostream> #include <cstring> #define N 10
using namespace std;
char g[N][N];
int row[N][N], col[N][N], cell[3][3][N];
bool dfs(int x, int y) { if (y == 9) return dfs(x + 1, 0); if (x == 9) { for (int i = 0; i < 9; ++ i) cout << g[i] << endl; return true; }
if (g[x][y] != '.') return dfs(x, y + 1); for (int i = 1; i <= 9; ++ i) { if (!row[x][i] && !col[y][i] && !cell[x / 3][y / 3][i]) { g[x][y] = i + '0'; row[x][i] = col[y][i] = cell[x / 3][y / 3][i] = true; if (dfs(x, y + 1)) return true; g[x][y] = '.'; row[x][i] = col[y][i] = cell[x / 3][y / 3][i] = false; } } return false; }
int main() { for (int i = 0; i < 9; ++ i) for (int j = 0; j < 9; ++ j) { cin >> g[i][j]; if (g[i][j] != '.') { int num = g[i][j] - '0'; row[i][num] = col[j][num] = cell[i / 3][j / 3][num] = true; } }
dfs(0, 0); return 0; }
|