Python实现有效数独验证算法详解

山间有风
山间有风
发布时间:2026-10-13| 3人浏览过
原创

本文介绍如何使用Python验证9x9数独的有效性。通过遍历二维数组,利用行、列及3x3宫格的字典记录已出现数字,快速检测重复项。核心在于通过公式计算宫格索引,确保每行、每列及每个宫格内数字1-9仅出现一次,提供完整代码与性能分析。

本文分享了使用Python验证有效数独的算法实现,供读者参考学习。

一、题目要求

需要判断一个9x9的数独棋盘是否有效。验证时仅需检查已填入的数字是否符合以下规则即可。

1. 数字1-9在每一行中只能出现一次。 2. 数字1-9在每一列中只能出现一次。 3. 数字1-9在每一个由粗实线分隔的3x3宫格内只能出现一次。

数独棋盘中的部分空格已填入数字,空白格使用字符 '.' 表示。

示例1:

输入: [ ["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"] ] 输出: true

示例2:

输入: [ ["8","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"] ] 输出: false

解释:与示例1相比,仅第一行第一个数字由5变为8,其余空格数字保持一致。

然而,由于左上角的3x3宫格内出现了两个数字8,违反了规则,因此该数独无效。

二、解题思路

  • 首先创建三个空数组:row、col和cell。其中cell数组中的每个字典代表一个3x3宫格,后续需将数据逐一填入这些结构中。
  • 遍历整个二维数组,在遍历过程中将数字分别存入行row、列col以及3x3宫格cell对应的字典中。这里将数字作为字典的key,而非value。
  • 随后进行判断:检查行、列、3x3宫格对应的字典中是否已存在当前棋盘值board[x][y]作为键名。若已存在,说明该数字重复,直接返回False。
  • 注意:字典中的值在此处均设为1,具体数值无实际意义,可根据需要随意更改。
  • 将数据存入3x3宫格是难点所在,关键公式为:num = 3*(x//3)+y//3。建议结合具体数独实例代入该公式深入理解其逻辑。
  • 当然,也可以不使用上述公式,改用if/else语句进行判断,虽然逻辑更直观,但不如该公式简洁高效。
  • 例如使用类似结构:if y<3 : ... elif 3<=y<6 : ... elif 6<=y : ...,通过列索引范围判断所属宫格。

具体代码如下:

#row,col,cell分别代表行,列,3x3单元格
row, col, cell =
[{}, {}, {}, {}, {}, {}, {}, {}, {}],
[{}, {}, {}, {}, {}, {}, {}, {}, {}],
[{}, {}, {}, {}, {}, {}, {}, {}, {}]
for x in range(9):
  for y in range(9):
    #取得单元格
    num = 3*(x//3)+y//3
    temp = board[x][y]
    #不需要存入 '.'
    if temp != '.':
      if (temp not in row[x]
      and temp not in col[y]
      and temp not in cell[num]):
        row[x][temp] = '1'
        col[y][temp] = '1'
        cell[num][temp] = '1'
      else:
        return False
return True

运行时间64ms,击败了99.3%的提交记录。

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数组操作技巧总结》、《Python数据结构与算法教程》、《Python列表(list)操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》。

希望本文所述的算法思路与代码实现能对读者的Python程序设计有所帮助。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。