• Python 数独求解器



    Sudoku(数独)是一种基于逻辑的数字填充谜题游戏,最受喜爱的是那些热爱逻辑和推理的人。解决数独谜题有助于提高集中注意力和逻辑思维能力。

    本文介绍了如何使用Python解决数独谜题。


    使用回溯算法在Python中解决数独

    在寻找计算问题的解决方案时,我们经常使用回溯算法。在解决数独时,它检查已填充的格子的数字是否有效。

    如果数字无效,它会检查从1到9的其他数字。如果找不到有效数字,它将回溯到前一个选项。

    当我们遇到死胡同并返回到先前的选择时,我们已经做出了一个选择并将更改我们的选择,从而得到一个不同的可能解。

    让我们采用实现数独求解器和回溯算法的方法。

    首先,我们需要通过形成谜题来设置数独板。

    def setBoardFunc(puz):
        global grid
        print('\n---------------数独求解器---------------\n')
        print('数独问题如下:')
        for i in range(0, len(puz), 9):
            row = puz[i:i+9]
            temp = []
            for block in row:
                temp.append(int(block))
            grid.append(temp)
        printGridFunc()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里,我定义了一个名为setBoardFunc()的函数来形成数独谜题。在循环过程中,它设置一个9x9的谜题,并用0初始化空单元格。

    完成函数操作后,它打印出给定的输入。然后我们需要打印出数独格局;这一步打印出带有给定输入的9x9格局。

    def printGridFunc():
        global grid
        for row in grid:
            print(row)
    
    • 1
    • 2
    • 3
    • 4

    接下来,我们将检查当前值是否可以放置在当前格子中。

    def checkValidFunc(row,column,num):
        global grid
        for i in range(0,9):
            if grid[row][i] == num:
                return False
        for i in range(0,9):
            if grid[i][column] == num:
                return False
        square_row = (row//3)*3
        square_col = (column//3)*3
        for i in range(0,3):
            for j in range(0,3):
                if grid[square_row+i][square_col+j] == num:
                    return False
        return True
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    这一步检查给定的数字是否适用于特定的格子。该数字不能是同一行、同一列或同一块中的任何其他格子。

    如果数字满足该要求并返回true,则可以移动到下一个值;否则,该数字被拒绝。然后我们必须遍历所有块来适应回溯算法。

    def solveFunc():
        global grid
        for row in range(9):
            for column in range(9):
                if grid[row][column] == 0:
                    for num in range(1,10):
                        if checkValidFunc(row,column,num):
                            grid[row][column] = num
                            solveFunc()
                            grid[row][column] = 0
                    return
        print('\n数独问题的解决方案:')
        printGridFunc()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    代码的后半部分检查数字是否有效。在这里,它引入了回溯算法。

    首先,它搜索空单元格;如果找到了,说明已经解决了数独,它打印出给定数独的解决方案。如果找到任何空格,它将通过迭代从1到9猜测一个数字。

    如果存在有效数字,则调用 solveFunc() 并移动到下一个空单元格,但如果没有有效的猜测,函数的先前调用将将单元格的值重置为0并继续迭代以找到下一个有效数字。

    当算法使用有效数字填充空格直到死胡同时,它会回溯过程并重新迭代整个过程。最后,让我们传递数独格局并调用函数来解决给定的数独谜题。

    puz = "004300209005009001070060043006002087190007400050083000600000105003508690042910300"
    grid = []
    setBoardFunc(puz)
    solveFunc()
    
    • 1
    • 2
    • 3
    • 4

    完整的源代码:

    def setBoardFunc(puz):
        global grid
        print('\n---------------数独求解器---------------\n')
        print('数独问题如下:')
        for i in range(0, len(puz), 9):
            row = puz[i:i+9]
            temp = []
            for block in row:
                temp.append(int(block))
            grid.append(temp)
        printGridFunc()
    
    def printGridFunc():
        global grid
        for row in grid:
            print(row)
    
    def checkValidFunc(row,column,num):
        global grid
        for i in range(0,9):
            if grid[row][i] == num:
                return False
        for i in range(0,9):
            if grid[i][column] == num:
                return False
        square_row = (row//3)*3
        square_col = (column//3)*3
        for i in range(0,3):
            for j in range(0,3):
                if grid[square_row+i][square_col+j] == num:
                    return False
        return True
    
    def solveFunc():
        global grid
        for row in range(9):
            for column in range(9):
                if grid[row][column] == 0:
                    for num in range(1,10):
                        if checkValidFunc(row,column,num):
                            grid[row][column] = num
                            solveFunc()
                            grid[row][column] = 0
                    return
        print('\n数独问题的解决方案:')
        printGridFunc()
    
    puz = "004300209005009001070060043006002087190007400050083000600000105003508690042910300"
    grid = []
    setBoardFunc(puz)
    solveFunc()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    输出:

    数独求解器


    总结

    尽管还有其他解决方法,但使用回溯算法可以得到数独问题更准确的最终解,但它需要更多时间,因为其中包含许多迭代。然而,解决数独谜题可以提高一个人的逻辑思维能力,并且是一种有趣的消遣方式。

  • 相关阅读:
    【MySQL】增删查改CURD(基础版)
    Linux控制台中,‘单引号‘和“双引号“的区别
    webpack学习使用
    【Linux】腾讯云服务器Linux环境搭载
    【Python项目】过马路游戏
    从旅游发展大会,看长沙的“落子”与“棋道”
    深入解析HTTP请求:了解请求特征与报文格式的关键秘密
    关于软件设计师考试中的算法
    最大二叉树
    【强化学习论文合集】五.2017国际表征学习大会论文(ICLR2017)
  • 原文地址:https://blog.csdn.net/fengqianlang/article/details/132947089