小车跑迷宫,如何完成?

先看视频1:

先看视频2:

要制作一个能顺利走到迷宫终点,并能按最短路径回来的小车,重中之重就是寻找其最短路径的算法,迷宫情况复杂多变,多个路口交错纵横,想要完美的找出最短路径并不容易,我因此总结出一套算法,能迅速找出最短路径,并适用于大多数迷宫情形,此算法对算力要求不高,不会过多阻碍主程序的运行。

在小车去终点时,我们规定小车必须优先左转,其次直走,最后右转,用暴力枚举即可到达终点。在迷宫中,把每一个线段相交的地方称作结点,经过总结,共有十字结点,正T型结点,左T型结点,右T型结点四种结点,大多数传统算法要求对每一个结点进行精准分类再分别处理,而此算法能对不同类型的结点进行统一处理。

在一个结点处,小车正对且压在车身下面的那根线我们称为点a,其正对着车的左侧的线称为点b,同理,正对着车前方的直线称为点c,右侧称为点d。

把此节点称为点A(见下图),当A为1,称为无效结点,A为0,称为有效节点,考虑到有多个结点,所以A,a,b,c,d用数组表示,每个字母的初始值都为0,数组下标最大值为100。再设定一个p统计结点个数,初始值为1。此外再设置一个调头结点N,N为1则已有调头动作,否则无。小车去往终点时途经每一个结点都计算一次,在此先介绍我的结点转向算法。

750863cb84468e8200ee71d7636e3106.png

5303530d8f4111ba7ca73e767afa19ce.png

 在遇到结点时,若车左转,则:若d[p]为1,则a[p]加1,否则若c[p]为1,则d[p]加1,否则若b[p]为1,则c[p]加1,否则若a[p]为1,则b[p]加1。称此为左侧结点转向法。

在遇到结点时,若车直走,则:若b[p]为0,则c[p]加1,否则若c[p]为0,则d[p]加1,否则若d[p]为0,则a[p]加1。称此为前侧结点转向法。

在遇到结点时,计算方法为:(小车在调头动作完成后,N置1)当小车驶到一个任意结点时,若N为1,则判定此节点为原结点,p不变,此时转向时再根据情况同理调用结点转向法,此时p为p,完成转向算法后将N置0。

否则若N为0,若A[p-1]为2,则判定此结点为已过结点,p不变此时转向时继续根据情况调用结点转向法,此时p为p-1,完成转向算法后将A[p]置为0,为无效结点。

否则,则立即将a置1,此时结点状态为新节点,p加1,A[p]置为1,为有效节点,此时若车左侧有线,则调用左侧结点转向法,否则调用前侧结点转向法,此时p为p。

以上述算法走到终点时,已将所走过的每个结点都归纳到算法中,每个小车已走过的结点都有属于自己的值,用另一套算法逐个处理结点值即可计算出最短路径。

在小车回起点时,我们抛弃原有的一切算法,另起炉灶,此时要先把所有有效节点剥离出来,然后按从终点到起点的顺序将有效节点存到一个数组中,在这里先介绍我的第三种算法。

在遇到结点时,若此结点d为1,则左转,否则若c为1,则直走,否则若b为1,则右转,我称此为结点回溯法,

由此算法可顺利回到起点。因为在每一个结点计算一次,统一计算再运行,故而此算法对算力要求低,占用运行内存少,运算速度极短,不会影响其他程序的运行。

总结来说,由结点转向算法和结点回溯法即可完美走完迷宫。

但此算法可灵活处理至二级结点,对于处理n级结点写死即可,因此我优化了此算法,使其可灵活处理n个结点,算法虽简单,但写代码实践时,其中也有许多细节需要处理,但由于篇幅限制,至此不做过多赘述。


用心推荐,联合朋友开发了一个培训班,0基础也可以参加。对未来迷茫的同学或者朋友,可以来试试,无论是转行还是本专业的人。

只要认真完成课程,拿到一份好offer绝对不在话下。也有很多专科、双非本科院校的同学通过学习此课程拿到了一个好offer。

有兴趣的同学请加下方微信咨询:

fe361fa7a259e93148e0b6be06e1b2af.jpeg

课程大纲:

bbdbe5c06f94fe6a06df12f6896db031.jpeg

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值