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

怎么使用Python进行数独求解

2023-06-29 06:06:45 742人浏览 安东尼

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

摘要

本篇内容主要讲解“怎么使用python进行数独求解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Python进行数独求解”吧!1. 引言数独这个名字的由来来自日语短语suuji wa d

本篇内容主要讲解“怎么使用python进行数独求解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Python进行数独求解”吧!

1. 引言

数独这个名字的由来来自日语短语suuji wa dokushin ni kagiru,意思是“数字必须保持单一”。数独游戏的流行也源于其规则的简单性:数独游戏要求在 9 x 9 空间的网格上进行数字填写。在行和列中有 9 个“正方形”的格子block(由 3 x 3 个子单元格cell组成)。每一行、每一列、每一个block都需要填写数字 1-9,行、列、block内不得重复任何数字。

好的,知道了上述数独的规则,那么我们就来直接进入主体吧。 :)

2.描述数独九宫格

这一步主要为使用一组数字来初始化我们的九宫格。我们使用setBoard() 函数将输入转换为适合我们后续操作的数据类型。我们使用以下约定:

  • 空的单元格cell初始化为默认值0。

  • 维持数独谜题数字值的数据类型是一个 9x9 大小的二维列表。

这里我们的输入是一个多行字符串,我们将其处理成二维列表的形式。样例代码如下:

# Initialize a 2-D list with initial values described by the problem. # Returns boarddef setBoard():    board = list()    sudokuBoard = '''    200080300060070084030500209000105408000000000402706000301007040720040060004010003'''    rows = sudokuBoard.split('\n')    for row in rows:        column = list()        for character in row:            digit = int(character)            column.append(digit)        board.append(column)    return board

上述代码运行后,如果展示在拼图游戏中,他的样子大概如下:

怎么使用Python进行数独求解

3.寻找下一个空子单元格

函数findEmpty() 函数的操作更加简单:对初始化后的九宫格作为参数传递,然后该遍历该九宫格中每一个子单元格cell,直到找到返回的第一个空的子单元格。如果没有找到空的子单元格,这表明我们的问题已解决,因此它返回None。

样例代码如下:

# Find next empty space in Sudoku board and return dimensionsdef findEmpty(board):    for row in range(9):        for col in range(9):            if board[row][col] == 0 :                return row,col    return None

4. 子单元格中设置值的合法性

函数isValid()的操作是确认设定的数字是否是九宫格子单元格的有效选项。为了使设置的值满足数独九宫格的要求,该值的设置需满足以下条件:

  • 同一行的任何子单元格cell都不应包含该数字

  • 同一列的任何子单元格cell都不应包含该数字

  • 该子单元格cell所在的block不应该包含该数字

如果我们设定的值满足以上所有条件,该函数返回True,否则返回False。代码如下:

# Check whether a specific number can be used for specific dimensionsdef isValid(board, num, pos):    row, col = pos    # Check if all row elements include this number    for j in range(9):        if board[row][j] == num:            return False    # Check if all column elements include this number    for i in range(9):        if board[i][col] == num:            return False    # Check if the number is already included in the block    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] == num:                return False    return True

以下是通过isValid() 函数中描述的条件后成功插入新值的动态示例:

怎么使用Python进行数独求解

同时,若我们引入一个与九宫格数独上已经存在的值冲突的数值,那么此时该值将不会被插入。图例如下:

怎么使用Python进行数独求解

5. 实现回溯算法

下一个函数是我们整个解决方案的核心思想,这里引入了回溯思想,该算法的实现步骤如下:

  • 搜索下一个空的子单元格cell。如果没有找到,那么我们已经解决了这个难题;如果没有,则转到第 2 步。

  • 通过迭代数字1-9 来猜测正确的数字,并参考已经确定的数字来检查它是否是一个合法的数字。

  • 如果找到一个有效的数字,此时递归调用solve() 函数并猜测下一个空的子单元格cell。

  • 如果数字1-9均无效,则将将子单元格cell的值重置为 0,并继续迭代以查找下一个有效数字。

# 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

由于递归理解起来不是那么直观,不妨让我们尝试使用动态来将整个过程形象化:

怎么使用Python进行数独求解

正如我们在上面的示例中看到的那样,该算法用有效数字填充空子单元格cell,直到出现死胡同;然后它回溯,直到重新迭代该过程。

6. 性能表现

上述我们的程序需要使用回溯算法来遍历每个单元格的许多潜在值。这当然不是最优的解法,可以预想到我们的解决方法的性能会很慢。

我们使用上述代码,来解决欧拉计划的第96题中的50道数独题目,运行时间为:

The execution time of above program is : 23.56185507774353 s

到此,相信大家对“怎么使用Python进行数独求解”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 怎么使用Python进行数独求解

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

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

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

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

下载Word文档
猜你喜欢
  • 怎么使用Python进行数独求解
    本篇内容主要讲解“怎么使用Python进行数独求解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Python进行数独求解”吧!1. 引言数独这个名字的由来来自日语短语suuji wa d...
    99+
    2023-06-29
  • 如何使用Python进行数独求解
    这篇文章主要介绍“如何使用Python进行数独求解”,在日常操作中,相信很多人在如何使用Python进行数独求解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用Python进行数独求解”的疑惑有所帮助!...
    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
  • 怎么使用thinkphp进行数据求和并排行
    这篇文章主要介绍“怎么使用thinkphp进行数据求和并排行”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用thinkphp进行数据求和并排行”文章能帮助大家解决问题。步骤1:连接数据库前往T...
    99+
    2023-07-05
  • 使用python怎么对输入的两个数进行求和
    使用python怎么对输入的两个数进行求和?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。用户输入两个数字,并计算两个数字之和# -*- co...
    99+
    2023-06-14
  • python使用sum函数进行求和计算
    在python中使用sum()函数进行求和计算的方法sum:sum()函数的作用是对序列进行求和计算。sum()函数语法:sum(iterable[, start])sum()函数使用方法:>>>sum([0,1,2]) 3 >>> sum...
    99+
    2024-04-02
  • 怎么使用Python进行数据分析
    使用Python进行数据分析可以通过以下几个步骤:1. 安装Python和相关库:首先需要安装Python解释器,推荐使用Anaco...
    99+
    2023-08-23
    Python
  • 怎么使用Python进行数据清洗
    这篇文章主要讲解了“怎么使用Python进行数据清洗”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用Python进行数据清洗”吧!缺失值当数据集中包含缺失数据时,在填充之前可以先进行一...
    99+
    2023-07-06
  • 使用Python怎么对整数进行反转
    本篇文章为大家展示了使用Python怎么对整数进行反转,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。题目:给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1:  输入:...
    99+
    2023-06-08
  • Python怎么使用Pandas进行数据分析
    首先,确保您已经安装了Pandas库。如果没有,请使用以下命令安装:pip install pandas一. 导入Pandas库import pandas as pd二. 读取数据使用Pandas,可以方便地读取多种数据格式,包括CSV、E...
    99+
    2023-05-16
    Python Pandas
  • 怎么使用Python进行下载
    本篇内容介绍了“怎么使用Python进行下载”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.使用requests你可以使用requests...
    99+
    2023-06-15
  • 在 JS 中怎么使用 Ajax 来进行请求
    本篇内容介绍了“在 JS 中怎么使用 Ajax 来进行请求”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1...
    99+
    2024-04-02
  • 使用SpringMVC请求怎么对handler进行映射
    这期内容当中小编将会给大家带来有关使用SpringMVC请求怎么对handler进行映射,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。请求映射源码前台发送给后台的访问请求是如何找到对应的控制器映射并执行后...
    99+
    2023-06-14
  • Python:使用Counter进行计数
        计数统计就是统计某一项出现的次数。实际应用中很多需求需要用到这个模型。比如测试样本中某一指出现的次数、日志分析中某一消息出现的频率等等‘这种类似的需求有很多实现方法。下面就列举几条。(1)使用dict看下面代码#coding=utf...
    99+
    2023-01-31
    Python Counter
  • 怎么使用Python进行数据科学研究
    本篇内容主要讲解“怎么使用Python进行数据科学研究”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Python进行数据科学研究”吧!1. 为何选择PythonPython作为一种语言,...
    99+
    2023-06-16
  • 怎么在Go语言中使用JSON进行请求
    这篇文章主要介绍“怎么在Go语言中使用JSON进行请求”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么在Go语言中使用JSON进行请求”文章能帮助大家解决问题。Go语言提供了许多方式发送HTTP请...
    99+
    2023-07-06
  • MySQL怎么使用Python进行连接
    一、表格与键概念主键:可唯一表示该资料(可以设置多个列表为主键)设置外键进行表与表的相连,且外键必须是其他表的主键(外键也可以设置自己表格的主键)二、创建资料库CREATE DATABASE `sql_tutorial`; --创建资...
    99+
    2023-05-14
    Python MySQL
  • Python怎么使用Spacy进行分词
    这篇文章主要介绍“Python怎么使用Spacy进行分词”,在日常操作中,相信很多人在Python怎么使用Spacy进行分词问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python怎么使用Spacy进行分词...
    99+
    2023-06-30
  • 怎么在Python中使用Pandas进行数据清洗
    怎么在Python中使用Pandas进行数据清洗?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。python的五大特点是什么python的五大特点:1.简单易学,...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作