python生成一笔画_Python系列—一笔画问题的算法研究

原标题:Python系列—一笔画问题的算法研究

鸣谢

VSRC感谢业界小伙伴——奶权,投稿精品原创类文章。VSRC欢迎精品原创类文章投稿,优秀文章一旦采纳发布,将有好礼相送,我们已为您准备好了丰富的奖品!

(活动最终解释权归VSRC所有)

0x00 一笔画完游戏

昨天和朋友出去外面吃饭,吃完饭后朋友打开了一个小程序玩了起来。

游戏长这样

大概玩法是:从地图中猫的位置开始出发,并且经过所有的格子就算过关。游戏还算挺有意思的,经过我的不断努力终于过到了30来关的样子。

并且随着游戏关卡的增加。游戏难度也变得越来越大,过一关需要非常久的时间。

最近也正好在研究算法,就打算看能不能写个通用的算法来找出每个地图的解。

0x01 哥尼斯堡的"七桥问题"

这个游戏的玩法和哥尼斯堡的"七桥问题"有点类似。

哥尼斯堡的"七桥问题":

18世纪著名古典数学问题之一。在哥尼斯堡的一个公园里,有七座桥将普雷格尔河中两个岛及岛与河岸连接起来(如图)。问是否可能从这四块陆 地中任一块出发,恰好通过每座桥一次,再回到起点?

当时人们想到的证明方法是把七座桥的走法都列出来一个一个试验,用排列组合的知识很容易得到七座桥所有的走法大概有7!=5040种,如果真的逐一试验,会是个很大的工作量。

但数学家欧拉没有这样想,欧拉把两座岛和河两岸抽象成顶点,七座桥抽象成连接每个顶点的七条边,那么这个问题就能被抽象成下面的图:

假设每座桥都恰好走过一次,那么对于A、B、C、D四个顶点中的每一个顶点,需要从某条边进入,同时从另一条边离开,进入和离开顶点的次数是相同的,即每个顶点有多少条进入的边,就有多少条出去的边。也就是说:每个顶点相连的边是成对出现的,即每个顶点的相连边的数量必须是偶数。

很明显,上图中A、C、D三个顶点相连的边都有3条,B顶点的相连边为5条,都是奇数。因此这个图无法从一个顶点出发,且恰好走过每座桥一次。

由此次证明人们又得到了欧拉路关系,要使得一个图形可以一笔画完,必须满足如下两个条件:

图形必须是连通的不能有孤立的点。

图中拥有奇数连接边的点必须是0或2。

对于一个连通图,通常把从某结点出发一笔画成所经过的路线叫做欧拉路。

那么这个游戏是不是就是让我们找到一条欧拉路呢?

0x02 对游戏进行抽象

按照上面证明七桥问题的方法,我们可以将游戏的地图抽象成这样:

其中14号顶点为起点

顶点和边的关系在程序中可以刻画成一个二维列表

graph = [

[1, 6], #0

[0, 2], #1

[1, 7, 3], #2

...

[24, 19] #25

]

graph列表的第一层表示每一个顶点,第二层则是与当前顶点有边的顶点࿰

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值