电子鼠,一个很烧脑的游戏,玩家需要制作电子鼠,通过程序编程,使电子鼠用最短时间,从起点到达中点。今天我就来说说这个电子鼠的算法以及需要考虑的问题。
首先以上面这个图为例,从绿色方块走到红色方块。怎么做到呢?在这个迷宫里,我们做容易想到的是不是就是贴着迷宫的一边走,比如一直沿着左边的墙走。在大多数迷宫这个方法都是行的通的,可是有一个很大的问题,比如说下面这个图。
大家来试试看,靠左靠右试试看?
怎么样,是不是发现怎么也走不到了。
其实,是应为这个迷宫被分为了两个部分,终点处的迷宫,他的墙不与任何从起点开始的墙连接,这样就会导致电子鼠一直被困在一个循环里,永远做不到,并且,电子鼠又不是人,它不像我们,走到一个地方,四处看一看,看到了终点就往终点走,所以这个并不是最优的方法。
这时,我们就要用到一种更加高级的算法了
深度优先搜索法了(Deep Frist Search简称DFS)。
或者广度优先搜索法(Breath First Search简称BFS)。
先说说DFS,这个算法在编程里面,是这么实现的,从起点开始走,先遍历每一个方向,上左下右,判断一下这四个点是否合法,如果合法的话,那就走到这里,以此类推,如果走到了死路,那么就会到上一个地方(来到这个格子的地方),然后往另一个方向遍历,直到遍历到了终点。
再说说BFS,这个算法它有很多用途(DFS也是),形象一点讲,有一个房间,里面有很多壮汉,起点的壮汉从房间外面拉出来他能拉的一个壮汉,然后呢,这个壮汉就被解聘了,剩下的壮汉继续拉来他能拉过来的壮汉然后都被解聘了,如果这个壮汉拉不了了(不可以拉来让自己过来的壮汉)那么他也只有被解聘了,如果有一个壮汉拉到了老板想要的那个壮汉(在终点的那个壮汉)则就结束循环。
如上图所示,dfs一定能到达终点,但不一定是最进的的。(蓝色是dfs走的,黄色是最短路)。
所以我们还得用更快的算法——洪水灌冲法。
假如我们现在是一个身在迷宫里的电子鼠,要走到终点(我们知道终点的坐标),就像上面这几幅图,绿色的线是我们始终的目标,我门一开始无视任何边,直接往终点走,遇到了边就转弯,但要保证一直往终点走,这样走出的路径一定是最短的。
但是在电子鼠的比赛上还要考虑很多东西,比如一下这两条路径。
像这样,很明显,转弯时需要时间的,所以,我们在这种连续的弯道可以直接从中间穿过,这样就可更加节省时间,让平均速度最快,当然迷宫里的弯道肯定都是直角弯,所以,转弯也可以用斜转的方法。像图二转弯角度更小,平均速度也是最大的。
而且,有些时候,最短的不一定是最快的,在最短的路径中,可能弯道特别多,有二十机个弯道,但是在另一条路径上,全是大直道,只有几个弯道,那么,如果你是开车的,你会选择那条路呢?
肯定是大直到多的那一条了。
好了,今天的讲解就到这里了,如果有小伙伴好奇,可以去B站上搜一下,那里有官方双语,更容易理解,也将的更全面。