iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >如何使用Python进行数独求解
  • 127
分享到

如何使用Python进行数独求解

2023-06-29 06:06:31 127人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要介绍“如何使用python进行数独求解”,在日常操作中,相信很多人在如何使用Python进行数独求解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用Python进行数独求解”的疑惑有所帮助!

这篇文章主要介绍“如何使用python进行数独求解”,在日常操作中,相信很多人在如何使用Python进行数独求解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用Python进行数独求解”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    1. 引言

    本文主要在前文解决方案的基础上,来思考如何通过改进来提升数独问题求解算法的性能。

    闲话少说,我们直接开始吧。 :)

    2. 前文回顾

    我们首先来回顾下前文的回溯算法,如下图示:

    如何使用Python进行数独求解

    在前文中,我们引入了回溯算法来对数独问题求解,通过迭代每个子单元格cell的所有可能取值来暴力解决该问题,直到引入数独九宫格中的新值与属于同一行,列或block块的子单元格中确定值之间没有冲突为止。这种解决方案虽然可以有效解决该问题,但是它绝对不是最佳的解决方案,因为它没有合理利用数独九宫格中提供的附加先验信息。下面,我们来一步步对前文算法进行优化吧。。。

    3. 减少非比要的迭代次数

    优化上述算法的第一个想法来自于这样的观察,我们的算法按顺序迭代所有数字1到9,直到它找到一个与已经包含相同值的同一行,列或block块中的另一个单元格不冲突的值。但是,数独九宫格中一些确定值会已经为我们提供了一些信息,说明哪些数字不可能添加到某个子单元格cell中。

    # Solve Sudoku using backtrackingdef solve(board):    blank = findEmpty(board)    if not blank:        return True    else:        row, col = blank    for i in range(1,10):        if isValid(board, i, blank):            board[row][col] = i            if solve(board):                return True            board[row][col] = 0    return False

    我们优化的思路是首先扫描我们的数独九宫格,将每个子单元格的所有可能的合法候选值保存在内存中然后再逐个迭代它们,而不是迭代所有数字。参考下图,演示了数独九宫格的 2 个子单元格的候选值的集合。正如我们的游戏规则所暗示的那样,每行,每列和每个block块不能包含相同的数字,因此在属于给定子单元格的同一行,列和所属block块的单元格中已经确定的所有数字都被排除在外。

    如何使用Python进行数独求解

    既然有了优化思路,那么我们接下来就可以来用代码实现上述想法啦.

    3.1 生成候选值字典

    接着我们需要一个数据结构(这里我们选用字典)来保存每个子单元格的候选值列表,该函数通过遍历整个九宫格中空的子单元格并调用我们的allowedValues()函数来返回子单元格的候选值列表.

    样例代码如下:

    # Store in a dictionary the legitimate # values for each individual celldef cacheValidValues(board):    cache = dict()    for i in range(9):        for j in range(9):            if board[i][j] == 0:                cache[(i,j)] = allowedValues(board,i,j)    return cache

    3.2 生成候选值列表

    在上小节中的allowValues() 函数与我们在前篇文中看到的isValid() 函数具有类似的逻辑,但在本例中,它返回值为每个子单元格所提取到的合法数字的列表。

    样例代码如下:

    def allowedValues(board,row,col):    numbersList = list()    for number in range(1,10):        found = False        # Check if all row elements include this number        for j in range(9):            if board[row][j] == number:                found = True                break        # Check if all column elements include this number        if found == True:            continue        else:            for i in range(9):                if board[i][col] == number:                    found = True                    break        # Check if the number is already included in the block        if found == True:            continue        else:            rowBlockStart = 3* (row // 3)            colBlockStart = 3* (col // 3)            rowBlockEnd = rowBlockStart + 3            colBlockEnd = colBlockStart + 3            for i in range(rowBlockStart, rowBlockEnd):                for j in range(colBlockStart, colBlockEnd):                    if board[i][j] == number:                        found = True                        break        if found == False:            numbersList.append(number)    return numbersList

    3.3 函数调用

    有了我们的单元格候选值缓存字典,下面我们准备测试该方案是否会显着提高我们的程序性能。

    为此我们还需要将 solve() 函数替换为一个新的函数solveWithCache(),该函数只迭代每个子单元格cell的合法值列表,而不是所有数字 1–9。

    代码如下:

    def solveWithCache(board, cache):    blank = findEmpty(board)    if not blank:        return True    else:        row, col = blank    for value in cache[(row,col)]:        if isValid(board, value, blank):            board[row][col] = value            if solveWithCache(board, cache):                return True            board[row][col] = 0    return False

    在实现所有改动后测试我们的代码为我们提供了所需的结果,与我们的第一个版本相比,跑同样50组测试用例执行时间明显缩短:

    The execution time of above program is : 15.41820478439331 s

    到此,关于“如何使用Python进行数独求解”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    --结束END--

    本文标题: 如何使用Python进行数独求解

    本文链接: https://www.lsjlt.com/news/322959.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • 如何使用Python进行数独求解
      这篇文章主要介绍“如何使用Python进行数独求解”,在日常操作中,相信很多人在如何使用Python进行数独求解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用Python进行数独求解”的疑惑有所帮助!...
      99+
      2023-06-29
    • 怎么使用Python进行数独求解
      本篇内容主要讲解“怎么使用Python进行数独求解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Python进行数独求解”吧!1. 引言数独这个名字的由来来自日语短语suuji wa d...
      99+
      2023-06-29
    • 使用Python进行数独求解详解(一)
      目录1.引言2.描述数独九宫格3.寻找下一个空子单元格4.子单元格中设置值的合法性5.实现回溯算法6.性能表现7.总结1. 引言 本文为介绍流行的数独游戏的系列文章中的第一篇。更具体...
      99+
      2024-04-02
    • 使用Python进行数独求解详解(二)
      目录1.引言2.前文回顾3.减少非比要的迭代次数3.1生成候选值字典3.2生成候选值列表3.3函数调用4.总结1. 引言 本文是数独游戏问题求解的第二篇,在前文中我们使用回溯算法实现...
      99+
      2024-04-02
    • python使用sum函数进行求和计算
      在python中使用sum()函数进行求和计算的方法sum:sum()函数的作用是对序列进行求和计算。sum()函数语法:sum(iterable[, start])sum()函数使用方法:>>>sum([0,1,2]) 3 >>> sum...
      99+
      2024-04-02
    • 如何使用Golang进行API请求
      Golang是一门现代化的编程语言,而且它在后端语言领域中越来越受欢迎。它的优点包括高效的并发处理、内存安全性和垃圾收集机制。在本文中,我们将探讨如何使用Golang进行API请求。首先,我们需要从安装Golang开始。Golang便携式安...
      99+
      2023-05-14
    • C++如何实现数独快速求解
      这篇文章主要介绍“C++如何实现数独快速求解”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++如何实现数独快速求解”文章能帮助大家解决问题。什么是数独数独是源自18世纪瑞士的一种数学游戏。是一种运...
      99+
      2023-06-29
    • 如何使用Python进行数据可视化
      这篇“如何使用Python进行数据可视化”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何使用Python进行数据可视化”文...
      99+
      2023-07-05
    • 如何使用Pycharm进行Python开
      如何使用Pycharm进行Python开发   开发Python的IDE有很多,比如Sublime text3, eclipse等,作为数聚传媒的研发人员,我最喜欢的还是使用Pycharm进行Python开发。下面我简单介绍一下这款开发工具...
      99+
      2023-01-31
      如何使用 Pycharm Python
    • python如何使用计数器进行元素计数
      这篇文章给大家分享的是有关python如何使用计数器进行元素计数的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用计数器进行元素计数当我们在列表、元组或字符串中有多个项目时(例如,多个字符),我们经常想计算每项中...
      99+
      2023-06-27
    • 如何在 PHP 中使用 JavaScript 进行 HTTP 请求?
      在现代 Web 开发中,经常需要使用 JavaScript 发送 HTTP 请求来获取数据。在某些情况下,需要在 PHP 中执行此操作。本文将探讨如何在 PHP 中使用 JavaScript 发送 HTTP 请求。 一、使用 XMLHtt...
      99+
      2023-11-07
      http apache javascript
    • React Native如何使用axios进行网络请求
      本篇内容主要讲解“React Native如何使用axios进行网络请求”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React Native如何使用axios进行网络请求”吧!在前端开发中,能...
      99+
      2023-06-20
    • 如何使用MPI_Reduce对来自不同处理器组的不同值进行独立求和
      使用MPI_Reduce函数可以对来自不同处理器组的不同值进行独立求和。以下是使用MPI_Reduce进行求和的步骤:1. 导入MP...
      99+
      2023-09-27
      MPI_Reduce
    • python如何使用数字序列进行遍历
      这篇文章主要介绍了python如何使用数字序列进行遍历,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如果希望使用数字序列进行遍历,可以使用Python内置的range函数。a...
      99+
      2023-06-17
    • 如何进行Python函数装饰器的使用
      如何进行Python函数装饰器的使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。装饰器装饰器的定义关于装饰器的定义,我们先来看一段github上大佬的定义:Functio...
      99+
      2023-06-26
    • 使用python怎么对输入的两个数进行求和
      使用python怎么对输入的两个数进行求和?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。用户输入两个数字,并计算两个数字之和# -*- co...
      99+
      2023-06-14
    • 怎么使用thinkphp进行数据求和并排行
      这篇文章主要介绍“怎么使用thinkphp进行数据求和并排行”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用thinkphp进行数据求和并排行”文章能帮助大家解决问题。步骤1:连接数据库前往T...
      99+
      2023-07-05
    • MySQL如何使用Python进行连接
      今天小编给大家分享一下MySQL如何使用Python进行连接的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、表格与键概念主...
      99+
      2023-07-06
    • python如何使用enumerate()进行迭代
      这篇文章将为大家详细讲解有关python如何使用enumerate()进行迭代,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用enumerate()而不是range(len())进行迭代如果我们需要遍历...
      99+
      2023-06-27
    • Python:使用Counter进行计数
          计数统计就是统计某一项出现的次数。实际应用中很多需求需要用到这个模型。比如测试样本中某一指出现的次数、日志分析中某一消息出现的频率等等‘这种类似的需求有很多实现方法。下面就列举几条。(1)使用dict看下面代码#coding=utf...
      99+
      2023-01-31
      Python Counter
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作