Python 数独求解器

news2024/10/2 1:24:03

文章目录

    • 使用回溯算法在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()

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

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

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

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

如果数字满足该要求并返回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到9猜测一个数字。

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

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

puz = "004300209005009001070060043006002087190007400050083000600000105003508690042910300"
grid = []
setBoardFunc(puz)
solveFunc()

完整的源代码:

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()

输出:

数独求解器


总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1024815.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

0.UML

1.图 1.1类图含义 第一层显示类的名称,如果是抽象类,则就用斜体显示。第二层是类的特性,通常就是字段和属性。第三层是类的操作,通常是方法或行为。注意前面的符号, ,表示public,-,表示private,#,表示protected。 1.2接口图 与类图的区别主要是顶端有<< interface >…

回收站清空文件恢复?恢复文件,就看这4种方法!

电脑回收站对于大部分经常误删文件的用户来说&#xff0c;确实帮了大忙。但有时&#xff0c;用户可能会有定期清空回收站的习惯。回收站清空后文件还能恢复吗&#xff1f;这确实是个烦人的问题。比如下面这个用户所遇到的问题&#xff1a; “大家快帮帮我吧&#xff01;昨天看电…

淘宝/天猫API 获得淘宝app商品详情原数据(优惠券详情)

item_get_app-获得淘宝app商品详情原数据 taobao.item_get_app 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;获取Key和secret接入secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#x…

学Python的漫画漫步进阶 -- 第十一步.常用的内置模块

学Python的漫画漫步进阶 -- 第十一步.常用的内置模块 十一、常用的内置模块11.1 数学计算模块——math11.2 日期时间模块——datetime11.2.1 datetime类11.2.2 date类11.2.3 time类11.2.4 计算时间跨度类——timedelta11.2.5 将日期时间与字符串相互转换 11.3 正则表达式模块—…

git vscode

01&#xff1a;工作区 **02&#xff1a;暂存区 git add . 3&#xff1a;本地库 git commit -m ’ 4&#xff1a;远程库 git push example 点击箭头之后

[架构之路-218]: 架构师责权利的定位, 架构师是技术领导者、决策者、激励者、企业家思维、战略思维、理论指导

目录 一、架构的诉求与系统的规模和复杂度强相关 1.1 系统的规模和复杂度对架构的影响 1.2 系统的业务需求对架构的影响 1.3 业架构和软件架构 二、架构师的类型 三、系统架构师 3.1 什么是系统架构师 3.2 系统架构师的技术素质要求 3.3 系统架构师的管理素质要求 3.…

【小黑送书—第二期】>>《用户画像:平台构建与业务实践》

在大数据时代&#xff0c;如何有效地挖掘数据价值并通过画像数据进行呈现&#xff0c;如何基于画像数据构建平台功能并提高业务产出&#xff0c;是值得各类公司和业务人员思考并付诸实践的事情。 通过画像释放大数据价值。大数据时代不缺少数据&#xff0c;而是缺乏挖掘数据价值…

【C++面向对象侯捷】7.三大函数:拷贝构造,拷贝复制,析构

文章目录 三个特殊函数构造函数和析构函数class with pointer members 必须有 拷贝构造 和 拷贝复制【因为编译器默认是浅拷贝】拷贝构造函数拷贝复制函数没有检查自我赋值&#xff0c;杀掉空间就完了.. 三个特殊函数 构造函数和析构函数 class with pointer members 必须有 拷…

Chrome下载离线安装包进行安装

https://www.google.cn/chrome/index.html?standalone1 standalone1表示下载离线安装包 ChromeSetup.exe是在线安装的就只有1M ChromeStandaloneSetup64.exe是离线安装的有10M

USI-0002 SDI-1624 HONEYWELL ,用于工业和物流4.0的人工智能

USI-0002 SDI-1624 HONEYWELL &#xff0c;用于工业和物流4.0的人工智能 生产、仓库、运输——生产、储存、分拣或包装货物的地方&#xff0c;也是提货的地方。这意味着几个单独的货物从存储单元如箱子或纸盒中取出并重新组装。有了FLAIROP(机器人采摘的联邦学习)项目费斯托…

PDA使用uview3.0上传图片组件缩略图不显示的问题解决

猫猫在为社群的梁总开发PDA扫码程序&#xff0c;接上VFP猫框后端&#xff0c;简直爽歪歪&#xff0c;开发又快又好。 终于快上线了&#xff0c;结果发现里面一个图片上传的功能&#xff0c;上传成功后&#xff0c;在PDA上看不到缩略图。 我在微信开发者工具测试一切好好的&…

易点易动固定资产管理平台:打破数据孤岛,实现一站式闭环管理

在现代企业中&#xff0c;固定资产管理的数据孤岛问题一直是制约企业管理效率的重要因素。然而&#xff0c;通过易点易动固定资产管理平台&#xff0c;企业可以实现ERP、OA系统、BPM系统、财务系统等多个系统的打通&#xff0c;打破数据孤岛&#xff0c;实现固定资产的一站式闭…

网络编程 day2

TCPser TCPcli UDPser UDPcli

HTML常用基本元素总结

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title> biao qian</title> </head> <body><h1>这是标题1</h1> <h2>这是标题2</h2> <h3>这是标题3</h3><p> 这…

半导体产品使用高温老化测试技术

主要功能&#xff1a;为了达到满意的合格率&#xff0c;几乎所有产品在出厂前都必须经过老化处理。制造商如何在不缩短老化时间的情况下提高效率&#xff1f;本文介绍了一种在老化过程中进行功能测试的新方法&#xff0c;以减少和缩短与老化过程相关的成本和时间问题。 在半导…

SSH终端使用——高级篇

1 SSH终端快捷按钮的使用 在对话框按快捷键“ctrl”“h”,可以弹出脚本代码&#xff0c;快捷输入。 2 切换终端风格 对话框右下角&#xff0c;点击可切换终端风格&#xff1b; 点击可切换文字大小。 3 打开文件图形和文件字符窗口 右键连接&#xff0c;选择“打开”&a…

Multisim14.0仿真(十八)74LS138译码器

一、仿真原理图&#xff1a; 二、74LS138译码器真值表 当选通端G1为高电平&#xff0c;选通端G2A、G2B为低电平时&#xff0c;地址端A、B、C的二进制编码在Y0~Y7对应的输出端以低电平译出。 三、仿真效果图&#xff1a;

为什么基于树的模型在表格数据上击败深度学习

一、说明 随着深度学习和新的一亿参数模型的大肆宣传&#xff0c;人们很容易忘记这些大型神经网络只是工具&#xff0c;它们有其所有的偏见和弱点。我通过我的内容强调的想法之一是&#xff0c;您应该拥有多样化技能的坚实基础&#xff0c;以便您能够以有效且高效的方式解决问题…

一遍关于vue基础语法下篇

目录 一.事件处理器 演示效果&#xff1a; 二.表单 演示效果&#xff1a; 三.组件通信父转子 演示效果&#xff1a; 四.组件通信子转父 演示效果&#xff1a; 好啦&#xff0c;今天的分享就到这了&#xff0c;希望能够帮到你呢&#xff01;&#x1f60a;&#x1f60a; 一.…

Linux上的Pip和Python升级指南

在Linux系统上&#xff0c;保持Pip和Python版本的最新状态对于顺利进行Python开发至关重要。通过升级Pip和Python&#xff0c;你可以享受到最新的功能、修复的bug以及提升的开发效率。本文将为你提供在Linux上升级Pip和Python的详细指南&#xff0c;助你打造更强大的开发环境。…