【无标题】

> 【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;
}
相关推荐
进击的荆棘2 小时前
C++起始之路——哈希表的实现
数据结构·c++·散列表·哈希
FakeOccupational6 小时前
【数学 密码学】量子通信:光的偏振&极化的量子不确定性特性 + 量子密钥分发 BB84算法步骤
算法·密码学
ZhengEnCi8 小时前
S10-蓝桥杯 17822 乐乐的积木塔
算法
贾斯汀玛尔斯8 小时前
每天学一个算法--拓扑排序(Topological Sort)
算法·深度优先
t***5448 小时前
如何配置Orwell Dev-C++使用Clang
开发语言·c++
大龄程序员狗哥8 小时前
第25篇:Q-Learning算法解析——强化学习中的经典“价值”学习(原理解析)
人工智能·学习·算法
exp_add38 小时前
质数相关知识
算法
CoderCodingNo8 小时前
【信奥业余科普】C++ 的奇妙之旅 | 13:为什么 0.1+0.2≠0.3?——解密“爆int”溢出与浮点数精度的底层原理
开发语言·c++
小辉同志9 小时前
215. 数组中的第K个最大元素
数据结构·算法·leetcode··快速选择
小O的算法实验室9 小时前
2025年IEEE TITS,基于矩阵的进化计算+面向无线传感器网络数据收集无人机路径规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进