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

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

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

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

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

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

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

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

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

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

寻找到下一个空格

轮流填入格中数字 1 到 9

递归判断填入数是否符合规则

二.程序

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

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

程序如下:

1 #coding=utf-8

2 importdatetime3 classsolution(object):4 def __init__(self,board):5 self.b =board6 self.t =07

8 def check(self,x,y,value):#检查每行每列及每宫是否有相同项

9 for row_item inself.b[x]:10 if row_item ==value:11 returnFalse12 for row_all inself.b:13 if row_all[y] ==value:14 returnFalse15 row,col=x/3*3,y/3*3

16 row3col3=self.b[row][col:col+3]+self.b[row+1][col:col+3]+self.b[row+2][col:col+3]17 for row3col3_item inrow3col3:18 if row3col3_item ==value:19 returnFalse20 returnTrue21

22 def get_next(self,x,y):#得到下一个未填项

23 for next_soulu in range(y+1,9):24 if self.b[x][next_soulu] ==0:25 returnx,next_soulu26 for row_n in range(x+1,9):27 for col_n in range(0,9):28 if self.b[row_n][col_n] ==0:29 returnrow_n,col_n30 return -1,-1 #若无下一个未填项,返回-1

31

32 def try_it(self,x,y):#主循环

33 if self.b[x][y] ==0:34 for i in range(1,10):#从1到9尝试

35 self.t+=1

36 if self.check(x,y,i):#符合 行列宫均无条件 的

37 self.b[x][y]=i #将符合条件的填入0格

38 next_x,next_y=self.get_next(x,y)#得到下一个0格

39 if next_x == -1: #如果无下一个0格

40 return True #返回True

41 else: #如果有下一个0格,递归判断下一个0格直到填满数独

42 end=self.try_it(next_x,next_y)43 if not end: #在递归过程中存在不符合条件的,即 使try_it函数返回None的项

44 self.b[x][y] = 0 #回朔到上一层继续

45 else:46 returnTrue47

48 defstart(self):49 begin =datetime.datetime.now()50 if self.b[0][0] ==0:51 self.try_it(0,0)52 else:53 x,y=self.get_next(0,0)54 self.try_it(x,y)55 for i inself.b:56 printi57 end =datetime.datetime.now()58 print '\ncost time:', end -begin59 print 'times:',self.t60 return

61

62

63 s=solution([[8,0,0,0,0,0,0,0,0],64 [0,0,3,6,0,0,0,0,0],65 [0,7,0,0,9,0,2,0,0],66 [0,5,0,0,0,7,0,0,0],67 [0,0,0,8,4,5,7,0,0],68 [0,0,0,1,0,0,0,3,0],69 [0,0,1,0,0,0,0,6,8],70 [0,0,8,5,0,0,0,1,0],71 [0,9,0,0,0,0,4,0,0]])72 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.060687times:45360

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

用python设计数独的心得体会_使用python解数独相关推荐

  1. python语言的实验心得体会_国产编程语言木兰被质疑换皮Python:当事人承认夸大、道歉...

    近日有报道称,中科院计算所的计算机体系结构国家重点实验室编译组成功研发了国产编程语言"木兰"(Mulan),主要面向物联网应用,可以成倍地提高应用执行效率,并且全面支持国产龙芯处理 ...

  2. python语言的实验心得体会_爱的五种语言——“好妈妈”培训班家教情商课课堂纪实!...

    12月26日晚,荷地镇"七群体七服务"专题培训暨首届"好妈妈"培训班第五节课开课.讲师团成员.东坪村村委会副主任吴丽云以<爱的五种语言>为题为培训班 ...

  3. python高级语言应用心得体会_《Python基础学习心得》1.1

    以下资料,均为网络搜索而来,放在这里,供大家学习参考. 1.1.Python语言简介(摘自<Python教程>) 如果你经常在电脑上工作,总会有些任务会想让它自动化.比如,对一大堆文本文件 ...

  4. 写python代码的心得体会_写python代码的一点感想

    记得之前写过一篇文章,html2javaben,并发布了一个相关的组件,大概的功能就是把抓取的html页面后抽取其中的结构化数据进行二次加工.最近在用python也在写一个好玩的抓取网页的东西,也想封 ...

  5. python编程基础的阅读心得体会_学习Python的一些心得体会(熊逸飞)

    PART 2 第一章作者没有抛出过多内容,只是简单介绍了Python作为编程语言的一些比较优势,然后介绍它的历史和创始人的故事.从90年首次发布到现在经历了十几次优化才有了如今我们使用的Python, ...

  6. 用python绘制爱心的心得体会_如何用python画爱心

    用python绘制爱心的基本步骤如下: 首先先下载安装好python程序. 在我们自己的电脑上找到python 的IDLE工具. 2.然后打开IDLE,新建一个文件,命名为test1.py. 相关推荐 ...

  7. python设计贪吃蛇游戏论文_用Python写一个贪吃蛇AI,让程序自己玩游戏

    前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了. 问题的关键在于,图片中的贪吃蛇真的很贪吃XD, ...

  8. 包装实训总结报告_包装设计实训心得体会

    包装设计实训心得体会 包装设计实训心得体会 当我们受到启发,对学习和工作生活有了新的看法时,不妨将其写成一篇心 得体会, 让自己铭记于心, 它可以帮助我们了解自己的这段时间的学习. 工作生 活状态. ...

  9. c语言项目研发实训设计,关于软件设计实训心得体会(通用5篇)

    关于软件设计实训心得体会(通用5篇) 当我们经过反思,对生活有了新的看法时,往往会写一篇心得体会,这样能够让人头脑更加清醒,目标更加明确.那么好的心得体会都具备一些什么特点呢?以下是小编精心整理的关于 ...

最新文章

  1. gff文件_GFF格式说明
  2. android画廊效果的轮播图,轮播图(3d画廊效果)
  3. PHP中文件操作相关
  4. 数位 DP 入门 (不要 62+windy 数)
  5. Linux批量部署 EXPECT 使用
  6. jquery上传图片_文件上传三种方式
  7. javascript --- 再读作用域和闭包
  8. Python案例:四种方式编程求解一元二次方程
  9. Redis(3-3):列表类型
  10. docker privileged作用_Docker 从入门到掉坑
  11. 1.1 训练_开发_测试集
  12. RpcException:No provider available for remote service异常
  13. linux php文件,如何在linux执行PHP文件
  14. python visio_再见,Visio! - Python绿色通道的个人空间 - OSCHINA - 中文开源技术交流社区...
  15. SMT贴片相关知识梳理
  16. 领域应用 | 知识结构化在阿里小蜜中的应用
  17. CDR类CAD制作室内装修平面图
  18. 程序员如何阅读英文资料
  19. 事件抽取(event extraction)
  20. 7zip核心算法LZMA源码分析心得

热门文章

  1. 我的世界服务器世界前缀修改,大佬教你如何给玩家添加名字前缀后缀
  2. 未来的智能家居产品,主要的销售场景
  3. python全局变量在整个程序内都有效_Python 全局变量使用
  4. python 全局变量和局部变量的区别
  5. 2019新闻列表_每日新闻摘要:2019年3月12日以来的热门故事
  6. 手把手教你使用Electron5+vue-cli3开发跨平台桌面应用
  7. VC++创建一个自定义桌面图标
  8. PE结构22.3.2
  9. python特征工程有序变量处理_R与Python手牵手:特征工程(分类变量)
  10. 分享几招教会你怎么给图片加边框