Python 数独求解器

文章目录

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


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

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


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

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

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

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

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

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

def setBoardFunc(puz):global gridprint('\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 gridfor row in grid:print(row)

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

def checkValidFunc(row,column,num):global gridfor i in range(0,9):if grid[row][i] == num:return Falsefor i in range(0,9):if grid[i][column] == num:return Falsesquare_row = (row//3)*3square_col = (column//3)*3for i in range(0,3):for j in range(0,3):if grid[square_row+i][square_col+j] == num:return Falsereturn True

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

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

def solveFunc():global gridfor 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] = numsolveFunc()grid[row][column] = 0returnprint('\n数独问题的解决方案:')printGridFunc()

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

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

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

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

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

完整的源代码:

def setBoardFunc(puz):global gridprint('\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 gridfor row in grid:print(row)def checkValidFunc(row,column,num):global gridfor i in range(0,9):if grid[row][i] == num:return Falsefor i in range(0,9):if grid[i][column] == num:return Falsesquare_row = (row//3)*3square_col = (column//3)*3for i in range(0,3):for j in range(0,3):if grid[square_row+i][square_col+j] == num:return Falsereturn Truedef solveFunc():global gridfor 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] = numsolveFunc()grid[row][column] = 0returnprint('\n数独问题的解决方案:')printGridFunc()puz = "004300209005009001070060043006002087190007400050083000600000105003508690042910300"
grid = []
setBoardFunc(puz)
solveFunc()

输出:

数独求解器


总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

车联网远程监控管理提升车辆调度效率,实现高效运营

随着智慧城市建设与物联网技术发展,车辆使用4G工业路由器网络实现车联网,并对车上视频监控、GPS定位以及温湿度传感器等信息进行数据采集和实时传输。这些数据的采集和监测将通过4G网络上传到管理平台,为车辆调度和运行效率的优化提供了有力的…

计算机组成原理——基础入门总结(一)

本帖更新一些关于计算机组成原理的重点内容。由于博主考研时并不会考这门课,但是考虑到操作系统中又很多重要晦涩的概念涉及很多诸如内存、存储器、磁盘、cpu乃至各种寄存器的知识,此处挑选一些核心的内容总结复盘一遍——实现声明:本帖的内容…

【微信小程序】外卖点餐效果展示

概述 外卖点餐效果展示,左右布局,快速点餐,商家信息展示等...程序是模仿人家的,所以界面没做什么调整,功能是没啥问题,可以正常使用... 详细 直接看效果图: 可以把这个点餐这个功能分为5部分…

第13篇:ESP32 idf wifi联网使用SNTP同步网络时间LCD ST7920液晶屏显示

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 ​​​​​​第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 第6篇:ESP32连接无源喇叭播…

看完这篇 教你玩转渗透测试靶机Vulnhub——Grotesque:2

Vulnhub靶机Grotesque:1.0.1渗透测试详解 Vulnhub靶机介绍:Vulnhub靶机下载:Vulnhub靶机安装:①:信息收集:②:暴力破解:③:SSH登入:④:提权&#…

day21算法

常见的七种查找算法: ​ 数据结构是数据存储的方式,算法是数据计算的方式。所以在开发中,算法和数据结构息息相关。今天的讲义中会涉及部分数据结构的专业名词,如果各位铁粉有疑惑,可以先看一下哥们后面录制的数据结构…

MapReduce YARN 的部署

1、部署说明 Hadoop HDFS分布式文件系统,我们会启动: NameNode进程作为管理节点DataNode进程作为工作节点SecondaryNamenode作为辅助 同理,Hadoop YARN分布式资源调度,会启动:ResourceManager进程作为管理节点NodeM…

uni-app 实现自定义按 A~Z 排序的通讯录(字母索引导航)

创建 convertPinyin.js 文件 convertPinyin.js 将下面的内容复制粘贴到其中 const pinyin (function() {let Pinyin function(ops) {this.initialize(ops);},options {checkPolyphone: false,charcase: "default"};Pinyin.fn Pinyin.prototype {init: functi…

JavaScript:二进制数组【笔记】

二进制数组【ArrayBuffer对象、Type的Array视图和DataView视图】JavaScript操作二进制数据的一个接口。 这些接口原本是和WebGL有关【WebGL是浏览器与显卡之间的通信接口】,为了满足JavaScript与显卡之间大量、实时数据交换,那么JavaScript和显卡之间的…

一款非常容易上手的报表工具,简单操作实现BI炫酷界面数据展示,驱动支持众多不同类型的数据库,可视化神器,免开源了

一款非常容易上手的报表工具,简单操作实现BI炫酷界面数据展示,驱动支持众多不同类型的数据库,可视化神器,免开源了。 在互联网数据大爆炸的这几年,各类数据处理、数据可视化的需求使得 GitHub 上诞生了一大批高质量的…

flink 端到端一致性

背景 我们经常会混淆flink提供的状态一致性保证和数据端到端一致性保证的关系,总以为他们表达的是同一个意思,事实上,他们不是一个含义,flink只能保证其维护的内部状态的一致性,而数据端到端的一致性需要数据源&#…

数据包络分析(DEA)

写在前面: 博主本人大学期间参加数学建模竞赛十多余次,获奖等级均在二等奖以上。为了让更多学生在数学建模这条路上少走弯路,故将数学建模常用数学模型算法汇聚于此专栏,希望能够对要参加数学建模比赛的同学们有所帮助。 目录 1. …

TypeScript 从入门到进阶之基础篇(一) ts类型篇

系列文章目录 文章目录 系列文章目录前言一、安装必要软件二、TypeScript 基础类型1.基础类型之 数字类型 number2.基础类型之 字符串类型 string3.基础类型之 布尔类型 boolean4.基础类型之 空值类型 void5.基础类型之 null 、undefined类型6.基础类型之 任意类型 any &#x…

第 363 场 LeetCode 周赛题解

A 计算 K 置位下标对应元素的和 模拟 class Solution { public:int pop_cnt(int x) {//求x的二进制表示中的1的位数int res 0;for (; x; x >> 1)if (x & 1)res;return res;}int sumIndicesWithKSetBits(vector<int> &nums, int k) {int res 0;for (int i…

CorelDRAW 2023怎么把图片转化为手绘素描风 简单几步轻松搞定

CorelDRAW 2023是一款非常好用的设计类软件&#xff0c;软件拥有非常多强大又好用的功能&#xff0c;可以帮助设计师快速创造出想要的效果&#xff0c;今天我们就来给大家介绍一下CDR的“素描”艺术笔触。它可以帮助用户快速将普通的图片快速转换成类似素描的风格&#xff0c;在…

接口测试——接口协议抓包分析与mock_L1

目录&#xff1a; 接口测试价值与体系常见的接口协议接口测试用例设计postman基础使用postman实战练习 1.接口测试价值与体系 接口测试概念 接口&#xff1a;不同的系统之间相互连接的部分&#xff0c;是一个传递数据的通道接口测试&#xff1a;检查数据的交换、传递和控制…

VUE build:gulp打包:测试、正式环境

目录 项目结构 Gulp VUE使用Gulp Vue安装Gulp Vue定义Gulp.js package.json build文件夹 config文件夹 static-config文件夹 项目结构 Gulp Gulp是一个自动化构建工具&#xff0c;可以帮助前端开发者通过自动化任务来管理工作流程。Gulp使用Node.js的代码编写&#xff…

使用Git把项目上传到Gitee的详细步骤

1.到Git官网下载并安装 2.到Gitee官网进行注册&#xff0c;然后在Gitee中新建一个远程仓库 3.设置远程仓库的参数 4.返回Gitee查看仓库是否生成成功 5.新建一个文件夹作为你的本地仓库 6.将新建好的文件夹初始化成本地仓库 第一步&#xff1a;右键点击刚创建的本地仓库&#…

Tomcat 的部署和优化

目录 1、什么是Tomcat 1.1、静态页面的选择 2、Tomcat是怎么运行的 3、安装jdk &#xff06; 部署jdk环境 & Tomcat 安装 1、安装jdk 2、配置jdk环境变量 3、tomcat安装 4、Tomcat启动 5.优化tomcat启动速度 6.Tomcat的主要命令 7.Tomcat 配置虚拟主机 8.Tomca…

第2章_freeRTOS入门与工程实践之单片机程序设计模式

本教程基于韦东山百问网出的 DShanMCU-F103开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id724601559592 配套资料获取&#xff1a;https://rtos.100ask.net/zh/freeRTOS/DShanMCU-F103 freeRTOS系列教程之freeRTOS入…