七桥问题python_用Python玩烧脑小游戏《一笔画完》,瞬间闯到100关
Python 的概念
昨天和朋友出去外面吃饭,吃完饭后朋友打开了一个小程序玩了起来......
加小编QQ群:832339352即可自动获取大量Python视频教程以及各类PDF!
游戏长这样
大概玩法是:从地图中猫的位置开始出发,并且经过所有的格子就算过关。游戏还算挺有意思的,经过我的不断努力终于过到了 30 来关的样子。
并且随着游戏关卡的增加,游戏难度也变得越来越大,过一关需要非常久的时间。
最近也正好在研究算法,就打算看能不能写个通用的算法来找出每个地图的解。
哥尼斯堡的"七桥问题"
这个游戏的玩法和哥尼斯堡的"七桥问题"有点类似。
哥尼斯堡的"七桥问题":18 世纪著名古典数学问题之一。在哥尼斯堡的一个公园里,有七座桥将普雷格尔河中两个岛及岛与河岸连接起来(如下图)。是否可能从这四块陆地中任一块出发,恰好通过每座桥一次,再回到起点?
当时人们想到的证明方法是把七座桥的走法都列出来一个一个试验,用排列组合的知识很容易得到七座桥所有的走法大概有 7! = 5040 种,如果真的逐一试验,会是个很大的工作量。
但数学家欧拉没有这样想,欧拉把两座岛和河两岸抽象成顶点,七座桥抽象成连接每个顶点的七条边,那么这个问题就能被抽象成下面的图:
假设每座桥都恰好走过一次,那么对于 A、B、C、D 四个顶点中的每一个顶点,需要从某条边进入,同时从另一条边离开,进入和离开顶点的次数是相同的,即每个顶点有多少条进入的边,就有多少条出去的边。
也就是说:每个顶点相连的边是成对出现的,即每个顶点的相连边的数量必须是偶数。
很明显,上图中 A、C、D 三个顶点相连的边都有 3 条,B 顶点的相连边为 5 条,都是奇数。因此这个图无法从一个顶点出发,且恰好走过每座桥一次。
由此次证明,人们又得到了欧拉路关系,要使得一个图形可以一笔画完,必须满足如下两个条件:图形必须是连通的不能有孤立的点。
图中拥有奇数连接边的点必须是 0 或 2。
对于一个连通图,通常把从某结点出发一笔画成所经过的路线叫做欧拉路。那么这个游戏是不是就是让我们找到一条欧拉路呢?
对游戏进行抽象
按照上面证明七桥问题的方法,我们可以将游戏的地图抽象成这样:其中 14 号顶点为起点。
顶点和边的关系在程序中可以刻画成一个二维列表。
graph 列表的第一层表示每一个顶点,第二层则是与当前顶点有边的顶点。
抽象完这张游戏地图后可以很清楚知道,这游戏并不是让我们找到一条欧拉路。
因为找到一条欧拉路,需要的是经过每一座桥,且只经过一次,也就是说每个顶点可以被多次经过。
而这个游戏需要的是经过每一个顶点,并不要求走完每一座桥,且顶点只能被经过一次。
哈密顿通路
在研究了七桥问题发现并不能解决这类问题后,我开始向团队的表哥们请教,其中一个表哥告诉我此类问题叫做哈密顿图 (这里感谢下团队的**@xq17**表哥)。
这里说的哈密顿图,实际上是哈密顿通路的一种特殊情况,指的是:由指定的起点出发,途中经过所有其他顶点且只经过一次 ,最后返回起点,称之为哈密顿回路。如果给定的图 G 具有哈密顿回路,则称图 G 为哈密顿图。
那么现在目标明确了,这个游戏的解法就是找到某个给定图的哈密顿通路。
但是问题来了!!!哈密顿通路问题,在上世纪七十年代初,被证明是 NP-hard 问题:一个复杂问题如果能在多项式时间内解决,那么它便被称为 P 类问题。
一个复杂问题如果不能确定在多项式时间内解决,那么它便被称为 NP 类问题。
什么意思呢?就拿质因数分解来说吧:P 类问题:23x37=?
NP 类问题:已知 axb=740914799,且 a 和 b 都是质数,求 a 和 b 的值
让我们来看看这个问题有多复杂:因为 axb=740914799,且 a 和 b 都是质数
设 P={x|2<=x<740914799/2,x 是质数}
易得 (a,b)∈PxP,即 P 与它自身的笛卡尔积
我们用一种叫做筛法的算法来求一下 P 集合的元素个数:
一共有 19841519 个质数,算了我大概 14 分钟。
PxP 的元素个数一共有 19841519^2 个,要一个个验证是否等于 740914799,无疑又是一项很大的工程,这就是典型的 NP 类问题。NP 类问题虽然难,但是可以很快验证一个给定的答案,是否正确。
比如上面的题,我告诉你答案 a=22229,b=33331,你很快就能验证答案是否正确了。而 NP-hard 问题则是比 NP 问题更难的问题,例如:围棋。
也就是说并不能找到一个友好的算法,来解决哈密顿通路问题。
算法设计
虽然找到一个图的哈密顿通路是 NP 困难的,但是好在游戏中的顶点不算太多,还是可以使用暴力一点的方法实现的,例如:图的深度优先遍历法(DFS) 即递归和回溯法思想。
算法流程:
①将当前顶点压入已访问栈和路径栈中。
②将与当前顶点相通的顶点列出来。
③随机选取一个相通的顶点,并判断此顶点是否在已访问栈中:在已访问栈中则取另一个相通的顶点。
不在则将这个相通的顶点作为当前顶点。
若所有相通的顶点都在已访问栈中, 则判断路径栈是否包含所有顶点。
路径栈中包含所有顶点,则路径栈为当前图的哈密顿通路。
不包含所有顶点则回到父顶点, 并从已访问栈和路径栈中删除。
④反复执行 1~3。
算法实现
上面说过图的顶点和边的关系可以用一个二维列表来描述:
但是要手动输入这些顶点和边的关系还是太麻烦了。仔细想了下,如果每个顶点的上下左右有顶点,就一定与上下左右的顶点有边。
那么这个二维列表就可以简化成
还可以再简化成一维列表:
简直机智如我啊!于是我写了个函数对一维列表进行转换:
而算法的实现用图的邻接矩阵则更为方便,因此我写了一个将上列二位列表转换成邻接矩阵形式的函数:
主要的 DFS 算法如下:
完整代码如下:
结束
在实现了功能后,我拿着这个程序成功过到了差不多一百关,然后就玩腻了,哈哈哈哈哈哈哈哈哈
七桥问题python_用Python玩烧脑小游戏《一笔画完》,瞬间闯到100关相关推荐
- python生成一笔画_用Python玩烧脑小游戏《一笔画完》,瞬间闯到100关
原标题:用Python玩烧脑小游戏<一笔画完>,瞬间闯到100关 " 昨天和朋友出去外面吃饭,吃完饭后朋友打开了一个小程序玩了起来...... 游戏长这样 大概玩法是:从地图中猫 ...
- python猜谜语小游戏代码_树莓派趣学实战100例--网络应用+Python编程+传感器+服务器搭建...
导语 内容提要 本书是面向第4代树莓派(Raspberry Pi4B)的全新实战指南.树莓派(Raspberry Pi)是一款价格低廉.只有一张信用卡大小的计算机.然而麻雀虽小,却五脏俱全,树莓派是一 ...
- python生成一笔画_python求解微信小游戏——一笔画完
1.概念引入: 哈密顿图:通过图G的每个结点一次,且仅一次的通路(回路),就是哈密顿通路.存在哈密顿通路的图叫作哈密顿图. 一笔画游戏的原理,就是给定我们若干哈密顿图,找到每个图的哈密顿通路.因此我们 ...
- python 控制鼠标点击需要100ms为什么_用 Python3 和 OpenCV 替我玩一玩微信小游戏 — 跳一跳 (这算外挂么)...
0 瞎弄 我知道你们喜欢先看效果 手残的我,始终跳不过你们这些超过 50 分的大佬.想起最近在用 Python 学习 ML (Mechine Learning, 机器学习) ,怎么用没学会,倒是里面神 ...
- python 玩公众号游戏_Python入门太难?不如从玩塔防小游戏开始,玩通关就能学会编程...
我一直认为,在python入门阶段学习基础理论,太枯燥.所以我们整理了很多有关python的项目案例,有详细教程还有源码,希望能帮助更多对python感兴趣的人. 这是其中一个适合入门的Python项 ...
- 我的名片能运行Linux和Python,还能玩2048小游戏,成本只要20元
晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 猜猜它是什么?印着姓名.职位和邮箱,看起来是个名片.可是右下角有芯片,看起来又像是个PCB电路板. 其实它是一台超迷你的ARM计算机,不仅 ...
- python 玩公众号游戏_从零基础开始,用python手把手教你玩跳一跳小游戏,直接打出高分...
这对于很多人来说,可能是已经过时的游戏,但是对于python入门来说,却是一个非常值得学习的项目. 我们收集了很多有关python入门的项目案例,包含了相应的教程和源码,哪怕你从未接触编程,也通过这些 ...
- 教你用Python自制拼图小游戏,一起来玩吧
摘要: 本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyt ...
- Python命令行小游戏—贪吃蛇
Python命令行小游戏-贪吃蛇 前言 一.贪吃蛇游戏初始界面及地图 1.游戏初始界面 2.游戏地图 二.命令符的设置.输出刷新和按键检测 1.库支持 2.c语言代码 3.Python代码(变量初始化 ...
最新文章
- vue中使用swiper的一些坑
- 深度学习目标检测中计算目标的AP(average precision)平均精度、有什么用?
- 有没有必要开项目周会
- PHP-代码审计-审计第一步
- python不带颜色的图形_python – 为什么seaborn pairplot中的kde子图中没有显示颜色?...
- 水晶报表横向打印BUG处理
- 风险评估资产重要性识别_什么是风险分析,如何识别和评估风险?
- 数学建模python matlab 编程(指派问题)
- 数学分析思维导图整理(四)单变量积分学
- 防止phpddos攻击
- 2016年最新J2EE基础入门教程目录(完结版)
- 傲腾内存不支持linux吗,内存英特尔® 傲腾™常见问题
- 谐波小波 matlab,基于谐波小波的电力系统谐波分析
- 樱(桜) - 堀江由衣 (日语-中文-罗马)
- 拍照扫描怎么弄?你可以试一下这两个方法
- 局域网 --- 共享文件夹设置与访问
- linux内核丢弃udp报文,内核udp报文截取、修改和发送
- 马云能否对反向收购雅虎说不?
- “TN”劫持:chrome命令行
- centos 7的firewalld防火墙配置IP伪装和端口转发(内附配置案例)