很久么有写东西了,最近闲着无聊,想学习Python,光看书和别人的代码挺无聊的,于是想自己找个小项目练练手。九宫格是一个大家都很熟悉也喜欢打发时间的游戏,于是打算用Python来实现一下。
九宫格是什么,相信大家都很清楚:
在 9 X 9 的格子上填写数字1,2,3,4,5,6,7,8,9,要求:
1、每行的数字不能重复
2、每列的数字不能重复
3、一共九个 3 X 3 的小区域中数字不能重复。
目前大多实现方法都是先和拉斯维加斯生成法和深度优解数独。这里也采用这种方法,不过实现细节上有一些区别。
由于涉及二维数据,为了涉及Python的包略微多一点,本文引入 Numpy,以及用于随机数的random包,和迭代工具itertools。
说明一下,这些包并不是必须使用的包,就算用最基础的python,也能实现。
废话少说,直接开码。
既然Python,必须OOP,因此,从定义类开始。
class Sudoku:
def __init__(self):
# 初始化九宫格
self.grids= np.zeros((9, 9), dtype='i1', order='C')
self.possibleNums= {
1, 2, 3, 4, 5, 6, 7, 8, 9}
根据九宫格的三个约束条件,获取每个格子(行、列)可能的数字集合。
def get_possible(self, row, col):
bRow, bCol= row// 3, col// 3
rowSet= set(self.grids[row, :])
colSet= set(self.grids[:, col])
# blockSet = set(chain.from_iterable(grids[bRow * 3: bRow * 3 + 3, bCol * 3: bCol * 3 + 3]))
blockSet = set(grids[bRow * 3: bRow * 3 + 3, bCol * 3: bCol * 3 + 3].reshape(9))
return self.possibleNums- rowSet- colSet- blockSet
采用深度优先方法解数独,如果尝试失败,就回退一步再行用别的数尝试别。直到成功。
def dfs(self):
for row in range(9):
for col in range(9):
if grids[row, col] == 0:
possible = self.get_possible(row

本文介绍了使用Python实现数独生成与解决的方法,通过深度优先搜索策略,并结合Numpy和random包。文章展示了如何创建类来满足数独的约束条件,并提供了拉斯维加斯方法生成数独的示例。此外,还探讨了数独出题的可能性和后续拓展方向。
最低0.47元/天 解锁文章
——生成填充好的数独&spm=1001.2101.3001.5002&articleId=106154529&d=1&t=3&u=83770b0b95374d6f9049c3242af5d775)
2544

被折叠的 条评论
为什么被折叠?



