使用python解决数独问题
数独规则:
在一个9 X 9的二维矩阵中,每一行(Row)、每一列(Col)和每个宫(House)均不存在相同的数字
设计思路:
把九宫格设计为一个二维列表,通过行列坐标来定位数字。
1:添加函数,作用是给不为0的数,依次填入1-9,如果1不满足条件,则填入2,以此类推,直到填入一个满足条件的数
2:检测函数,作用是判断输入的数是否满足条件
3:下一个函数,作用是填完当前数之后,查找到下一个不为0的坐标,继续调用添加函数
4:如果该坐标没有满足条件的数,则重置当前数,从上一个循环处继续尝试。
class Sudoku():def __init__(self, origin):self.origin = origin
# 添加数字函数
# row为行坐标,col为列坐标
def add_num(self, row, col):if self.origin[row][col] == 0: # 如果该数为0,则进行循环添加数字for i in range(1, 10):if self.check(row, col, i): # 调用检测函数,当返回值为True时,该数字符合规则self.origin[row][col] = i # 把i赋值给当前坐标next_row, next_col = self.next_num(row, col) # 调用下一个数字函数if next_row == -1: # 当返回值为-1的时候,没有不为零的数,程序结束。print(self.origin)return Trueelse:# 继续回调此函数result = self.add_num(next_row, next_col)# 当此数都不符合规则的时候,重置当前数,返回上一层if result == None:self.origin[row][col] = 0else:return True# 检查函数
def check(self, row, col, i):# 检查行里面是否有重复数字for row_i in self.origin[row]:if row_i == i:return False# 检查列里面是否有重复数字for col_i in self.origin:if col_i[col] == i:return False# 检查每个宫里面是否有重复的数字# x,y为该宫里面左上角数字的坐标x, y = row - row % 3, col - col % 3# xy是一个3X3的宫组成的列表xy = self.origin[x][y:y + 3] + self.origin[x + 1][y:y + 3] + self.origin[x + 2][y:y + 3]for j in xy: # 遍历列表,如果列表中存在与i相同的数,返回Falseif j == i:return Falsereturn True# 查找下一个数函数
def next_num(self, row, col):# 列坐标加1,遇到为0的数,返回该数字的行、列坐标for n_col in range(col + 1, 9):if self.origin[row][n_col] == 0:return row, n_col# 列坐标循环完之后,行坐标加1,列坐标从0-9依次增加,# 继续查找下一个不为0的数for row_n in range(row + 1, 9):for col_n in range(0, 9):if self.origin[row_n][col_n] == 0:return row_n, col_n# 没有不为零的数,返回-1,程序结束return -1, -1
if __name__ == '__main__':s = Sudoku([[0, 2, 0, 0, 0, 1, 0, 0, 0],[5, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 3, 0, 0, 0, 0, 4],[0, 6, 0, 0, 0, 0, 5, 0, 0],[0, 0, 0, 0, 7, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 2, 0, 0],[7, 0, 9, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 2, 0, 0, 8, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0]])# 如果第一个数为0,直接调用添加函数,否则先调用查找下一个函数,再调用添加函数if s.origin[0][0] == 0:s.add_num(0, 0)else:row, col = s.next_num(0, 0)s.add_num(row, col)
使用python解决数独问题相关推荐
- python解决数独问题_Python-如何消除数独方块中的凸度缺陷?
小编典典 我有一个可行的解决方案,但是你必须自己将其转换为OpenCV.它用Mathematica编写. 第一步是通过将每个像素除以关闭操作的结果来调整图像的亮度: src = ColorConver ...
- Python解决数独
Environment: Python27 # -*- coding: UTF-8 -*- ''' Created on 2017年6月9日@author: LXu4 ''' import copy ...
- 启发式搜索算法解决数独问题sudoku,附python实现
定义 数独是源自18世纪瑞士的一种数学游戏.是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个粗线宫(3*3)内的数字均含1 ...
- 摒弃法解决数独问题sudoku,附python实现
定义 数独是源自18世纪瑞士的一种数学游戏.是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个粗线宫(3*3)内的数字均含1 ...
- delphi dbgrideh 遍历每一个单元格_用Python解数独[1]:求每个单元格的行值域
目录 用Python解数独[0] 用Python解数独[1]:求每个单元格的行值域 用Python解数独[2]:求列值域和九宫格值域 用Python解数独[3]:求总值域 用Python解数独[4]: ...
- python deepcopy函数_用Python解数独[6]:递归获得最终答案
目录 用Python解数独[0] 用Python解数独[1]:求每个单元格的行值域 用Python解数独[2]:求列值域和九宫格值域 用Python解数独[3]:求总值域 用Python解数独[4]: ...
- VBA:完美解决数独问题----全网最强
[说在前面]: 之前,我在微信朋友圈看到一个同事发了一个状态,说的是她在家辅导孩子做作业,一个数独的题目,好像没有做出来.我看了下,我也做不出来,后来仔细想了下,花了两个多小时时间,用Python编了 ...
- python可以数独游戏吗_学习python编程如何一键做出数独游戏答案 | k12教育网
在学习python编程如何一键做出数独游戏答案之前,我们需要知道什么是Python? Python指的是Python编程语言(用于编写被认为是有效Python代码的语法规则)和Python解释器软件, ...
- 解决数独问题用人工智能还是量子计算?
作为一种有趣的棋盘游戏,数独诞生100周年之后,它是如何成为计算研究的焦点之一的呢?探索如何使用人工智能或量子计算机从头开始创建一个智能数独求解器. 在深入探究之前,先来了解一下历史 马克•布洛赫说: ...
最新文章
- iredmail 邮件服务器搭建
- module 'cv2' has no attribute 'CV_LOAD_IMAGE_GRAYSCALE'
- 技术宝典 | ToB 业务场景下自动化测试的实践及探索
- Oracle 11gR2 GI日常管理手册
- 如何设置 jqplot 图表插件的标题图例和直线
- IE 弹出框处理经验
- Docker、Kubernetes与PaaS不得不说的渊源
- springmvc(4)注解简单了解
- 学会放下自己,就能释然许多
- java-程序流程控制
- Camera成像中的Demosaic
- 死链接检测 java,【死链接检测】工具查询方法及死链接处理方法
- RINEX广播星历文件读取(N文件)
- QQ互联登陆(Java)
- PS Adobe软件使用 快捷键
- CUDA11.1安装AlphaPose
- 服务器机房消防系统,服务器机房消防系统和维护
- Harbor docker
- 内网映射之natapp
- Wrong namespace. Expected 'cn.itheima.dao.CustomerMapping' 错误
热门文章
- (转)手机淘宝视频下载分析
- ccpd文件名转成xml_Fedora 16 64bit 下安装 LBP2900打印机
- 多元线性回归——《应用回归分析R语言版》
- 开源SWD脱机烧录器-第三章 基于QT的上位机
- 【C++游戏引擎Easy2D】想做游戏,这三个功能少不了(time+renderer+logger)
- Echarts柱状图label优化历程
- 2023 电脑PC 素材解析浏览器插件 支持20网
- 真实项目技术总结:软件开发过程和成本
- Linux 2.6内核配置说明 (国嵌)
- Linux 2.6 menuconfig内核编译配置选项详解