很久么有写东西了,最近闲着无聊,想学习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