前面多篇推文已经介绍了整个课设的绝大部分内容,本文是迷宫求解系列的最后一篇推文。
本文将介绍最后一种寻找迷宫出路的方法,复杂度较高,文末也将对此次课设进行总结。
0 1新的思路此次介绍的求解迷宫的方法,说起来很简单,这一方法在实现之前经过了反复思考与确认,最终也实际验证过,简单来说是一种预处理的方法。
遍历迷宫矩阵,将所有的死胡同堵上。
总结起来只有上面这一句话,但是如何实现就是一个难题了,首先是如何定义这个死胡同。四周都是墙壁那肯定是死胡同,问题是生成的迷宫里面不会有那种四周都是墙壁的,所有应当是三面是墙壁,只有一面是道路,这才是死胡同,把这个位置标记为死胡同。
但是只标记这个位置就行了吗?它只有一面是道路,可是和它相邻的这个道路也有可能是属于死胡同的一部分,只是把死胡同的尽头那个位置标记上显然是不够的,所以我们还需要在标记一个位置之后,对它的唯一邻居也进行判断,接下来是邻居的邻居,.........。直到某一个位置不止一个邻居,那么它显然就不属于死胡同,或者说当前不能确定它是死胡同的一部分,这时候才结束判断。
有了上述关于一个位置是否为死胡同的判断标准之后,就可以开始接下来的内容了。
0 2思路实现先思考下我们需要什么?
判断一个位置是否只有唯一邻居,即该位置是否为死胡同。
如果一个位置只有唯一邻居,找到它唯一邻居的位置,重复上一步的判断。
其实说了很多,有一个很重要的地方还没有说明。我们对一个为死胡同的位置该如何标记的问题,由于此前的几个算法使用 -1 标记试探过的点,而这里死胡同并不属于试探过程,而是一个预处理过程,而且也为了表示上的统一,此处不使用-1标记死胡同,使用数字4标记。
实际上如果使用一个负数进行标记也会给判断死胡同带来麻烦。
标记过程可以看成是,将死胡同的尽头新砌一堵墙,死胡同的邻居就有可能成为砌墙之后的新死胡同的尽头了。
既然看成是新砌一堵墙,那么标记为什么不直接使用 1 呢,1 不就代表墙壁吗,而且判断还更加方便。关于这个问题,这是因为我在课设中设置了重新初始化迷宫这一步,它的作用就是当按钮选择一