二、设计与实现
1、设计思想
按照一种广度优先的算法,从起点开始,逐步为迷宫中每个通路位置(0)标记到起点的距离,直至标记到终点为止。若整个迷宫中的通路位置(0)都标记完毕,仍然没有找到终点,迷宫无解;若标记到终点,则迷宫有解,再通过从迷宫终点按标记距离递减,回溯到迷宫的起点,同时记录走过的路径,此路径便是最短距离。
2、类结构
- 主要数据结构
主要的数据结构是链栈和链队列。
链队列用来存储刚标记过距离的但其周围未进行距离标记的节点,利用了队列先进先出的特点。刚刚被标记过距离的节点被存入队尾,当新一轮循环开始时,从队列中取出队首节点,对其周围节点进行距离标记并存入队尾。
链栈用来存储最短路径中的各个节点。利用链栈后进先出的特点,在从终点回溯时,越靠近终点的节点越先被存入栈。在从栈中取出节点进行输出时,越靠近起点的节点越先输出。
4、算法设计
三、测试与结论
1、测试环境:Visual Studio 2019
2、测试用例
1)数据输入如下图:
2)随机自动生成如下图:
3)寻找最短路线并依次输出坐标和移动方向如下图:
4)输入错误,选择的出入口不在迷宫范围内,出入口重叠时提醒如下图:
5)为防止迷宫过大,屏幕无法正常输出迷宫,程序中列数设置了上限,如下图:
6)迷宫无解时,输出如下图:
- 选择重复使用程序、选择清屏如下图:
3、测试结论
经过测试,代码圆满完成了题目的各项要求,实现了迷宫的输入、迷宫自动生成、最短路径的寻找和输出。
本题要点和难点在于建立数组,存储迷宫中各个坐标状态(是否可以通行,是否已经经过);设计算法,寻找最短路径;建立链式队列,用来存储刚标记过距离的但其周围未进行距离标记的节点;建立链式堆栈,实现路径的保存,并最终输出。