Python 练手之数独(一)——生成填充好的数独

很久么有写东西了,最近闲着无聊,想学习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
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值