> 【C++程序题练习】数独
数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。
如有多解,输出一个解 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
输入描述:
输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的。
输出描述: 输出九行,每行九个空格隔开的数字,为解出的答案。
cpp
#include <iostream>
using namespace std;
// 数独的数字矩阵
int nums[9][9];
bool sign = false;
// 读取输入
void input() {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
cin >> nums[i][j];
}
}
}
// 检查在位置(n / 9, n % 9)放置数字k是否违反数独规则
bool check(int n, int k) {
// 检查所在行是否合法
for (int i = 0; i < 9; i++) {
if (nums[n / 9][i] == k) return false;
}
// 检查所在列是否合法
for (int i = 0; i < 9; i++) {
if (nums[i][n % 9] == k) return false;
}
// 检查所在3x3宫格内是否合法
int x = n / 9 / 3 * 3;
int y = n % 9 / 3 * 3;
for (int i = x; i < x + 3; i++) {
for (int j = y; j < y + 3; j++) {
if (nums[i][j] == k) return false;
}
}
// 全部检查通过则合法
return true;
}
// 深度优先搜索解决数独
void DFS(int n) {
// 所有数字都填写完毕,找到解
if (n == 81) {
sign = true;
return;
}
// 如果当前数字已经存在,跳过
if (nums[n / 9][n % 9] != 0) {
DFS(n + 1);
} else {
// 逐一尝试1到9中的每个数字
for (int i = 1; i <= 9; i++) {
// 如果数字i能放在当前位置
if (check(n, i)) {
nums[n / 9][n % 9] = i;
DFS(n + 1);
// 如果找到解,则结束搜索
if (sign) {
return;
}
// 如果未找到解或者i不合适,则撤销该数字
nums[n / 9][n % 9] = 0;
}
}
}
}
int main() {
input(); // 读取输入
DFS(0); // 开始解数独
if (sign) { // 如果找到解,则打印
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
cout << nums[i][j] << " ";
}
cout << endl;
}
} else {
cout << "No solution found for the given Sudoku." << endl;
}
return 0;
}