python数独游戏源代码100行_python实现解数独程序代码
偶然发现linux系统附带的一个数独游戏,打开玩了几把。无奈是个数独菜鸟,以前没玩过,根本就走不出几步就一团浆糊了。
于是就打算借助计算机的强大运算力来暴力解数独,还是很有乐趣的。
下面就记录一下我写解数独程序的一些思路和心得。
一.数独游戏的基本解决方法
编程笼统的来说,就是个方法论。不论什么程序,都必须将问题的解决过程分解成计算机可以实现的若干个简单方法。俗话说,大道至简。对于只能明白0和1的计算机来说,就更需要细分步骤,一步一步的解决问题了。
首先来思考一下解数独的基本概念。
数独横九竖九共八十一个格子,同时又分为9个九宫格。规则很简单——需要每一个格中的数字,都保证与其所在横排和竖排以及九宫格内无相同数字。
所以我们的大概思路就是,从第一个空格开始试着填数,从 1 开始填,如果 1 不满足横排竖排九宫格无重复的话,就再填入 2 ,以此类推,直到填入一个暂时满足规则的数,中断此格,移动到下一个空格重复这个过程。
如果到达某个空格发现已经无数可选了,说明前面某一格填错了,那就返回上一格,从上一格的中断处继续往 9 尝试,直到这样回朔到填错的那一格。
这样的话,我们就可以整理出重要的步骤了:
•寻找到下一个空格
•轮流填入格中数字 1 到 9
•递归判断填入数是否符合规则
二.程序
首先测试数独使用的是芬兰数学家因卡拉花费3个月时间设计出的世界上迄今难度最大的数独。如下
将空格用 0 表示,同时将数独表示成嵌套的列表,这样每格的行数和列数就正好是列表中每个对应数的索引。
程序如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#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_itemin self.b[x]:
if row_item== value:
return False
for row_allin 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_itemin row3col3:
if row3col3_item== value:
return False
return True
def get_next(self,x,y):#得到下一个未填项
for next_souluin range(y+1,9):
if self.b[x][next_soulu]== 0:
return x,next_soulu
for row_nin range(x+1,9):
for col_nin 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 iin 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 iin 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 不断填入数字同时达到记录中断点的作用。通过下一层的返回值来确定是否回朔。
程序输出如下:
1
2
3
4
5
6
7
8
9
10
11
12
[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数独游戏源代码100行_python实现解数独程序代码相关推荐
- python数独游戏源代码100行_python实现自动解数独小程序
跟朋友最近聊起来数独游戏,突发奇想使用python编写一个自动计算数独解的小程序. 数独的规则不再过多阐述,在此描述一下程序的主要思路: (当前程序只针对于简单的数独,更复杂的还待深入挖掘) 1.计算 ...
- 数独游戏前端学习笔记及后续解数独方法
学习于默课网学习视频的整理笔记 视频老师分享代码库 基于我本地已经安装了nmp/node所以只添加了yarn 安装yarn: npm install -g yarn 安装成功后,查看版本号yarn - ...
- Python足球游戏源代码,热血足球小游戏,可双人玩
基于Python pygame的足球游戏源代码,游戏可以双人玩,游戏入口程序为soccer.py. 控制人物一 方向键:wasd ,射门键:r 控制人物二,方向键: 键盘方向键,射门键:k 程序运行截 ...
- Python扫雷游戏源代码及图片素材
Python扫雷游戏源代码.源程序共有两个文件及一个资源包:main.py及mineblock.py,资源包请前往百度网盘下载, https://pan.baidu.com/s/1u-qsJhAaCJ ...
- Python拼图游戏源代码,可定制拼图图片,支持多种难度,可九宫格、十六宫格、二十五宫格
配置环境 安装pygame模块 pip install pygame 引入资源 将照片,添加到resources/pictures路径下 照片.jpg格式 主函数代码 pintu.py 一个配置文件c ...
- python新年有趣代码_搞几款由“Python”语言编写的“有趣、恶搞、好玩”的程序代码!...
下载好向圈APP可以快速联系圈友 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 为提高大家对"Python"编程语言的学习兴趣,今天给大家分享几款有趣的Python程序代 ...
- python数独游戏源代码_使用Python编写数独游戏自动出题程序
数独是一个很好玩的游戏,可以锻炼推理能力.下面的代码可以自动生成数独游戏题目. from random import shuffle, randrange def generate(): # 初始网格 ...
- python漂亮界面 数独游戏源代码_使用Python编写数独游戏自动出题程序
原标题:使用Python编写数独游戏自动出题程序 数独是一个很好玩的游戏,可以锻炼推理能力.下面的代码可以自动生成数独游戏题目. fromrandom importshuffle, randrange ...
- python制作恶搞_搞几款由“Python”语言编写的“有趣、恶搞、好玩”的程序代码!...
为提高大家对"Python"编程语言的学习兴趣,今天给大家分享几款有趣的Python程序代码,感兴趣的小伙伴可以跟着学习借鉴哦!进群:839383 765可以获取Python学习资 ...
最新文章
- python转cython_Cython安装与使用入门
- 敲代码就是一把梭_2020必看!开发五年的大佬日常工作中所使用的java代码技巧...
- acer clear 工具_50个能帮你节省时间的开发工具!(值得收藏)-头条
- xml教程之java解析xml文档
- 简单的启动代码 IMPORT |Image$$RO$$Limit|
- 螺旋矩阵 IIPython解法
- [功能发布]Excel催化剂2周年巨献-网页数据采集功能发布,满足90%合理场景使用...
- Git的使用(快速入门)
- 所有的低谷,都是为了更上一层楼
- POJ 3268 Bookshelf 2 动态规划法题解
- eclipse导入android项目报错
- Atitit node.js问题解决总结t99 目录 1.1. 找不到node程序	1 1.2. GBK编码问题	1 2. 按行读取gbk编码问题	2 2.1. 先写入txt utf8 encode
- 2020.9.19hive函数和自定义UDF函数
- awesome PHP之依赖注入容器pimple
- matlab excel 单元居中,用matlab如何识别excel里的单元格是否为合并单元格|excel表格怎么调整行高和列宽...
- html 实时曲线 js,基于d3.js实现实时刷新的折线图
- 【编程书库】入门+进阶C语言,这几本就够了!
- Spring Boot项目学习之通用权限管理项目01
- 2018 51信用卡春招后端开发实习题解
- Python 模拟登录淘宝
热门文章
- 浅谈设计模式01-策略模式
- man iptables by iptables-save v1.3.5
- 2021-05-19
- 关联分析(二):关联模式的评估
- django NoReverseMatch 错误问题
- C#在线获取歌词(转)
- asp.net引用用户控件
- java if在内存中_全面理解Java内存模型
- 中南林业科技大学的计算机研究生分数线,2019中南林业科技大学研究生分数线汇总(含2016-2019历年复试)...
- 德州职业技术学院计算机系,德州职业技术学院计算机系元旦晚会相声视频