python实现解数独程序代码

发布时间 - 2026-01-11 00:37:03    点击率:

偶然发现linux系统附带的一个数独游戏,打开玩了几把。无奈是个数独菜鸟,以前没玩过,根本就走不出几步就一团浆糊了。

于是就打算借助计算机的强大运算力来暴力解数独,还是很有乐趣的。

下面就记录一下我写解数独程序的一些思路和心得。

一.数独游戏的基本解决方法

编程笼统的来说,就是个方法论。不论什么程序,都必须将问题的解决过程分解成计算机可以实现的若干个简单方法。俗话说,大道至简。对于只能明白0和1的计算机来说,就更需要细分步骤,一步一步的解决问题了。

首先来思考一下解数独的基本概念。

数独横九竖九共八十一个格子,同时又分为9个九宫格。规则很简单——需要每一个格中的数字,都保证与其所在横排和竖排以及九宫格内无相同数字。

所以我们的大概思路就是,从第一个空格开始试着填数,从 1 开始填,如果 1 不满足横排竖排九宫格无重复的话,就再填入 2 ,以此类推,直到填入一个暂时满足规则的数,中断此格,移动到下一个空格重复这个过程。

如果到达某个空格发现已经无数可选了,说明前面某一格填错了,那就返回上一格,从上一格的中断处继续往 9 尝试,直到这样回朔到填错的那一格。

这样的话,我们就可以整理出重要的步骤了:

•寻找到下一个空格
•轮流填入格中数字 1 到 9
•递归判断填入数是否符合规则

二.程序

首先测试数独使用的是芬兰数学家因卡拉花费3个月时间设计出的世界上迄今难度最大的数独。如下

将空格用 0 表示,同时将数独表示成嵌套的列表,这样每格的行数和列数就正好是列表中每个对应数的索引。

程序如下:

 #coding=utf-8
 import datetime
 class solution(object):
   def __init__(self,board):
     self.b = board
     self.t = 0
 
   def check(self,x,y,value):#检查每行每列及每宫是否有相同项
     for row_item in self.b[x]:
       if row_item == value:
         return False
     for row_all in self.b:
       if row_all[y] == value:
         return False
     row,col=x/3*3,y/3*3
     row3col3=self.b[row][col:col+3]+self.b[row+1][col:col+3]+self.b[row+2][col:col+3]
     for row3col3_item in row3col3:
       if row3col3_item == value:
         return False
     return True
 
   def get_next(self,x,y):#得到下一个未填项
     for next_soulu in range(y+1,9):
       if self.b[x][next_soulu] == 0:
         return x,next_soulu
     for row_n in range(x+1,9):
       for col_n in range(0,9):
         if self.b[row_n][col_n] == 0:
           return row_n,col_n
     return -1,-1 #若无下一个未填项,返回-1
 
   def try_it(self,x,y):#主循环
     if self.b[x][y] == 0:
       for i in range(1,10):#从1到9尝试
         self.t+=1
         if self.check(x,y,i):#符合 行列宫均无条件 的
           self.b[x][y]=i #将符合条件的填入0格
           next_x,next_y=self.get_next(x,y)#得到下一个0格
           if next_x == -1: #如果无下一个0格
             return True #返回True
           else:    #如果有下一个0格,递归判断下一个0格直到填满数独
             end=self.try_it(next_x,next_y)
             if not end:  #在递归过程中存在不符合条件的,即 使try_it函数返回None的项
               self.b[x][y] = 0  #回朔到上一层继续
             else:
               return True
 
   def start(self):
     begin = datetime.datetime.now()
     if self.b[0][0] == 0:
       self.try_it(0,0)
     else:
       x,y=self.get_next(0,0)
       self.try_it(x,y)
     for i in self.b:
       print i
     end = datetime.datetime.now()
     print '\ncost time:', end - begin
     print 'times:',self.t
     return
 
 
 s=solution([[8,0,0,0,0,0,0,0,0],
     [0,0,3,6,0,0,0,0,0],
     [0,7,0,0,9,0,2,0,0],
     [0,5,0,0,0,7,0,0,0],
     [0,0,0,8,4,5,7,0,0],
     [0,0,0,1,0,0,0,3,0],
     [0,0,1,0,0,0,0,6,8],
     [0,0,8,5,0,0,0,1,0],
     [0,9,0,0,0,0,4,0,0]])
 73 s.start()

值得注意的是使用的递归判断能够很巧妙的在走错分支时回朔到上一层。具体实现是通过 for 循环来从 1 到 9 不断填入数字同时达到记录中断点的作用。通过下一层的返回值来确定是否回朔。

程序输出如下:

[8, 1, 2, 7, 5, 3, 6, 4, 9]
[9, 4, 3, 6, 8, 2, 1, 7, 5]
[6, 7, 5, 4, 9, 1, 2, 8, 3]
[1, 5, 4, 2, 3, 7, 8, 9, 6]
[3, 6, 9, 8, 4, 5, 7, 2, 1]
[2, 8, 7, 1, 6, 9, 5, 3, 4]
[5, 2, 1, 9, 7, 4, 3, 6, 8]
[4, 3, 8, 5, 2, 6, 9, 1, 7]
[7, 9, 6, 3, 1, 8, 4, 5, 2]

cost time: 0:00:00.060687
times: 45360

可以看到程序虽然运算次数比较多,但是速度还是很快的。


# python  # 数独代码  # 数独  # python解数独  # 使用Python进行数独求解详解(一)  # Python图像识别+KNN求解数独的实现  # 用Python解数独的方法示例  # python实现自动解数独小程序  # 简单实现python数独游戏  # 使用Python进行数独求解详解(二)  # 递归  # 填入  # 的是  # 是个  # 九宫格  # 未填  # 卡拉  # 上一层  # 芬兰  # 菜鸟  # 第一个  # 那就  # 不出  # 世界上  # 很有  # 以此类推  # 错了  # 很简单  # 可以看到 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在Windows服务器上快速搭建网站?  Laravel如何处理表单验证?(Requests代码示例)  如何快速上传自定义模板至建站之星?  Laravel distinct去重查询_Laravel Eloquent去重方法  Java解压缩zip - 解压缩多个文件或文件夹实例  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  如何快速搭建高效可靠的建站解决方案?  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  如何快速生成专业多端适配建站电话?  如何在 React 中条件性地遍历数组并渲染元素  如何在IIS7上新建站点并设置安全权限?  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  Laravel如何与Pusher实现实时通信?(WebSocket示例)  怎样使用JSON进行数据交换_它有什么限制  如何在万网开始建站?分步指南解析  Swift中循环语句中的转移语句 break 和 continue  英语简历制作免费网站推荐,如何将简历翻译成英文?  如何在阿里云完成域名注册与建站?  七夕网站制作视频,七夕大促活动怎么报名?  高防服务器:AI智能防御DDoS攻击与数据安全保障  无锡营销型网站制作公司,无锡网选车牌流程?  EditPlus中的正则表达式 实战(4)  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  Laravel如何使用Telescope进行调试?(安装和使用教程)  成都网站制作公司哪家好,四川省职工服务网是做什么用?  如何在VPS电脑上快速搭建网站?  bootstrap日历插件datetimepicker使用方法  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  清除minerd进程的简单方法  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  如何用wdcp快速搭建高效网站?  动图在线制作网站有哪些,滑动动图图集怎么做?  简单实现Android验证码  如何在香港服务器上快速搭建免备案网站?  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  如何在万网自助建站中设置域名及备案?  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  javascript如何操作浏览器历史记录_怎样实现无刷新导航  Linux网络带宽限制_tc配置实践解析【教程】