Python 解析数独

前几天,四年级的弟弟拿着数独题来问我,我陷入了沉思,为了避免以后的尴尬,做了一个数独解析的算法。
在这里插入图片描述

"""
1、参数
grid是数独中所有的数
row是行下标
col是列下标
2、主要功能
寻找空值并返回对应的行列下标
3、返回值
x、y是空值的行列下标
如果数独中没有空值,就返回-1,-1
"""


def getNullIndex(grid, row, col):
    # 从row,col开始遍历
    for x in range(row, 9):
        for y in range(col, 9):
            if grid[x][y] == 0:
                return x, y
    # 从头开始遍历
    for x in range(0, 9):
        for y in range(0, 9):
            if grid[x][y] == 0:
                return x, y
    # 没有空值返回-1,-1
    return -1, -1


"""
1、参数:
grid是数独中所有的数,row是行下标、col是列下标、value是填入的值
2、主要功能:
判断填入的值是否符合规则(行、列、九宫格不能重复规则)
3、返回值:
True代表符合规则,False代表不符合规则
"""


def judgeValue(grid, row, col, value):
    # 行结果
    rowValid = all([value != grid[row][x] for x in range(9)])
    # 行合法
    if rowValid:
        # 列结果
        colValid = all([value != grid[x][col] for x in range(9)])
        # 列合法
        if colValid:
            # 最小行、列的下标
            minRow, minCol = 3 * (row // 3), 3 * (col // 3)
            # 遍历所在的九宫格
            for x in range(minRow, minRow + 3):
                for y in range(minCol, minCol + 3):
                    if grid[x][y] == value:
                        return False
            # 九宫格合法
            return True
    # 行不合法
    return False


# 利用深度优先搜索去解决数独问题
"""
1、参数:
grid是数独中所有的数,row是行下标、col是列下标
2、主要功能:
开始填入正确的值
"""


def DFS2SD(grid, row=0, col=0):
    # 得到空值的index
    i, j = getNullIndex(grid, row, col)
    # 数独中没有空值
    if i == -1:
        return True
    # 填入1-9
    for k in range(1, 10):
        # 如果这个数字符合规则
        if judgeValue(grid, i, j, k):
            # 对空值进行赋值
            grid[i][j] = k
            # 调用自己,递归。
            if DFS2SD(grid, i, j):
                return True
            # 如果递归返回False,把空值复位为0
            grid[i][j] = 0
    return False


if __name__ == '__main__':
    # 构建数独,第1行,第二行...第n行,未知数用0代替。
    matrix = [[0, 1, 0, 0, 0, 8, 4, 0, 7], [9, 5, 0, 0, 0, 0, 0, 0, 0], [0, 0, 8, 0, 1, 0, 0, 0, 0],
              [0, 8, 2, 0, 0, 0, 0, 0, 0], [7, 0, 0, 4, 0, 6, 0, 0, 8], [0, 0, 0, 0, 0, 0, 6, 2, 0],
              [0, 0, 0, 0, 5, 0, 7, 0, 0], [0, 0, 0, 0, 0, 0, 0, 8, 2], [5, 0, 3, 2, 0, 0, 0, 1, 0]]
    # 执行
    DFS2SD(matrix)
    # 输出
    print(matrix)
/*
结果
[[2, 1, 6, 9, 3, 8, 4, 5, 7], [9, 5, 4, 7, 6, 2, 8, 3, 1], [3, 7, 8, 5, 1, 4, 2, 6, 9], [6, 8, 2, 1, 9, 5, 3, 7, 4], [7, 3, 5, 4, 2, 6, 1, 9, 8], [4, 9, 1, 8, 7, 3, 6, 2, 5], [8, 2, 9, 6, 5, 1, 7, 4, 3], [1, 6, 7, 3, 4, 9, 5, 8, 2], [5, 4, 3, 2, 8, 7, 9, 1, 6]]
*/

总结

十六阶的数独,只需要把9改为16,10改为17即可,换汤不换药,原理一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
数独是一种经典的游戏,在计算机科学中也有很多人尝试使用编程语言来编写数独程序。其中,Python是一种常用的编程语言,比较适合用来编写数独程序。 首先,编写数独程序需要定义数独的数据结构。常用的方式是使用二维数组来表示数独的九宫格,每个格子用数字0~9来表示,其中0代表着该格子为空。 其次,需要编写数独求解算法。一般而言,数独问题可以使用回溯算法来解决。具体的实现过程可以在每次填完一个数字后,递归地填下一个位置。如果填到了最后一个位置,就代表求解成功;如果某个位置填不进任何数字了,就需要回溯到上一个位置重填。这个过程需要进行一定的剪枝,以提高求解的效率。 除了求解算法之外,还需要编写数独的生成算法。一般而言,生成数独的过程是从一个空的九宫格开始,并随机填入一些数字,然后用求解算法验证这个数独是否有解。如果有解,就再填入一些数字,直到生成一个完整的数独。 最后,需要编写用户界面。这可以使用Python提供的GUI库来实现。用户界面可以包括一个可交互的数独棋盘,用户可以通过鼠标或者键盘来填写数字,求解数独或者生成数独。为了提高用户体验,还可以添加一些提示和错误检查等功能。 总之,Python编写数独程序是一项比较有挑战性的任务,需要对Python编程语言和数独算法有一定的了解。不过,一旦掌握了这些基本技能,编写高效而优美的数独程序就不在话下了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值