当前位置: 首页 > article >正文

数独判定:矩阵中的算法之美

数独判定:矩阵中的算法之美

数独作为一种风靡全球的益智游戏,不仅挑战人们的逻辑思维能力,还为算法学习者提供了绝佳的练手机会。今天,我们就从算法的角度,用矩阵遍历与条件判断来解决一个常见问题:如何判定一个数独是否有效?不仅如此,本文还会结合代码实例,带大家深入理解背后的逻辑。


什么是有效的数独?

有效数独并不要求数独已解开,而是保证以下三个条件:

  1. 每一行中的数字(1-9)不能重复。
  2. 每一列中的数字(1-9)不能重复。
  3. 每个3×3的小方块中的数字(1-9)不能重复。

这三个规则既是逻辑的核心,也是算法设计的依据。


算法思路:从规则到实现

要验证数独的有效性,我们需要处理一个9×9的二维矩阵。算法核心是将遍历与集合判断相结合,逐步检查行、列和子矩阵的有效性。

核心思路:
  1. 矩阵遍历:遍历整个数独矩阵,分别记录每行、每列和每个小方块中已经出现的数字。
  2. 条件判断:每当遇到非空格数字时,检查该数字是否已经存在于对应的行、列或小方块中。
  3. 及时终止:一旦发现重复数字,则直接判定为无效。

实现代码与注释

以下是Python实现的完整代码,使用哈希集合(Set)来高效存储和检查数字。

def is_valid_sudoku(board):
    """
    检查给定的数独矩阵是否有效。
    
    :param board: 9x9的二维数组,'.'代表空格,数字为'1'-'9'。
    :return: 如果数独有效,返回True;否则返回False。
    """
    # 定义三个集合数组,分别用于存储行、列、小方块中出现的数字
    rows = [set() for _ in range(9)]  # 每行一个set
    cols = [set() for _ in range(9)]  # 每列一个set
    blocks = [set() for _ in range(9)]  # 每个3x3方块一个set

    for i in range(9):  # 遍历每一行
        for j in range(9):  # 遍历每一列
            num = board[i][j]  # 获取当前格子的内容
            if num == '.':  # 空格跳过
                continue

            # 计算小方块索引:左上为0,右下为8
            block_idx = (i // 3) * 3 + (j // 3)

            # 检查当前数字是否在对应行、列或小方块中
            if num in rows[i]:
                print(f"数字{num}在第{i}行重复!")
                return False
            if num in cols[j]:
                print(f"数字{num}在第{j}列重复!")
                return False
            if num in blocks[block_idx]:
                print(f"数字{num}在第{block_idx}号小方块重复!")
                return False

            # 将数字加入对应的集合
            rows[i].add(num)
            cols[j].add(num)
            blocks[block_idx].add(num)

    return True  # 若未发现冲突,数独有效!

示例与运行结果

以下是一个数独矩阵的示例及验证过程:

sample_board = [
    ["5", "3", ".", ".", "7", ".", ".", ".", "."],
    ["6", ".", ".", "1", "9", "5", ".", ".", "."],
    [".", "9", "8", ".", ".", ".", ".", "6", "."],
    ["8", ".", ".", ".", "6", ".", ".", ".", "3"],
    ["4", ".", ".", "8", ".", "3", ".", ".", "1"],
    ["7", ".", ".", ".", "2", ".", ".", ".", "6"],
    [".", "6", ".", ".", ".", ".", "2", "8", "."],
    [".", ".", ".", "4", "1", "9", ".", ".", "5"],
    [".", ".", ".", ".", "8", ".", ".", "7", "9"]
]

print(is_valid_sudoku(sample_board))  # 输出:True
分析:
  • 在这个示例中,矩阵符合数独规则,因此程序返回True
  • 如果矩阵中某行、某列或某小方块中存在重复数字,程序会即时指出错误并返回False

算法的优点与优化

优点
  1. 高效性:使用哈希集合检查重复,时间复杂度为O(n^2),空间复杂度为O(n)。
  2. 清晰性:逻辑简单,代码易读,适合初学者理解和扩展。
可优化点
  1. 减少空间占用:如果矩阵较大,可以使用位运算代替集合存储,进一步节省内存。
  2. 并行化:在行、列和小方块的检查中实现多线程或协程,充分利用多核处理器。

延伸思考

虽然本文讨论的是数独的有效性判定,但类似的矩阵遍历与条件判断方法还可以应用于:

  1. 图像处理中的区域检测。
  2. 图算法中的连通性检查。
  3. 数据表格中的冲突检测。

这些应用场景都能从本文的算法设计中得到启发。


结语

数独问题虽小,却蕴含着矩阵与算法的魅力。通过矩阵遍历与条件判断,我们不仅解决了数独有效性判定的实际问题,更为掌握算法与数据结构打下了扎实基础。希望本文能让你感受到算法之美,同时激发你在生活与工作中探索更多应用场景的兴趣。


http://www.kler.cn/a/593542.html

相关文章:

  • PyTorch中,将`DataLoader`加载的数据高效传输到GPU
  • 代码审计学习笔记
  • vue 加密解密
  • Deskflow 一款免费且开源的多设备键盘和鼠标共享工具
  • 用 pytorch 从零开始创建大语言模型(一):理解大型语言模型
  • Android compose中的附带效应-人话
  • Tinyflow AI 工作流编排框架 v0.0.7 发布
  • 【正点原子K210连载】第七十六章 音频FFT实验 摘自【正点原子】DNK210使用指南-CanMV版指南
  • Java 爬取淘宝商品评论接口(item_review)的完整指南
  • 5.2《生活中的透镜》——5.3《凸透镜成像规律》讲后再上
  • 蓝牙音频软件开发--杰理可视化SDK系列学习笔记汇总(持续更新)
  • 深入解析过滤器模式(Filter Pattern):一种灵活高效的设计模式
  • ruby介绍【前端扫盲】
  • 【原创】使用ElasticSearch存储向量实现大模型RAG
  • 【VUE】day05-ref引用
  • 代码随想录第55期训练营第七天|LeetCode454.四数相加II、383.赎金信、15.三数之和、18.四数之和
  • 火山引擎(豆包大模型)(抖音平台)之火山方舟的Prompt的使用测试
  • RabbitMQ消息可靠性问题
  • 前沿技术一览科技改变生活新趋势
  • 用gemini画流程图