一.题目展示
设计要求:
1.STAGE0:1)用文件读入语句从附件中读入信息分析后输出。
2)构造网格并检查路线的状态评估后输出。
2.STAGE1:1)拓展程序做到可视化输出栅格和路线。
2)尝试修改重新规划被阻碍的路线并可视化输出。
二.思路简析:
文件输入:
采用创建文件流(fstream)的方式,通过seekg函数控制文件指针的位置,来跳过无用信息,录入有效信息并加以甄别。
网格构造:
因网格的大小由输入数据传递,故采用用二级指针和指针数组模拟二维动态数组的方法创建网格,网格的坐标为文件中的行和列,网格的值代表此格是否能走。需注意数组是否溢出和建立的先后顺序问题。
阻塞块加载:
额外构造加载块函数,从文件对应处读取块坐标,将块的坐标对应的值存为0(不可走),即在网格中完成了块的加载。
路线建立:
对于路线,将其理解为一个有先后数据的链表,故创建链表储存路线点的行列坐标和下一步的指针。故可以构造检查函数检查路线即遍历链表,查看链表头尾元素对应起点终点,查看链表的坐标对应的二维数组值确定有无阻塞块,将链表前后的行和列坐标作差查看是否非法行动(一次移动多格)。
可视化输出:
对于路线的可视化输出,由题目可知,输出的图表还有一圈边界坐标,故要将二维数组的边界调大一格,则输出时的对应关系应是:
首先判定0行0列对应的输出索引,得到坐标变换关系后按格检索二维数组和链表对应点状态,优先级为输出阻塞块>输出起始点>输出路线>输出格子。
Re-Planning:
路径修复函数的实现方式,由动态规划的基本思想可以将问题抽象为寻找两点间可行路径中的最优路径问题。那么第一步就要先找到断开点和要求的连接点。在找到连接点后,选取连接点的上下左右四个方向,按题目提示
构建新的指针指向下个节点,并入链表。
可以发现,这样直接并入的方式对(b)、(c)二图的重新规划很吻合,但是对于下面的(d)、(e)二图则不吻合,会在左边墙边不停的循环。
这是因为简单的选取上左下右的策略只考虑当前位置,而不考虑断点目标点的位置,无记忆性的单纯搜索没法找到到断点目标点的最短路径,有时更会出现上述的失效死循环情况。
三.优化方案:
那么如何完成对最短路径的搜索呢,就需要对比所有路径,然后保证最短的路径被检索,然后保证其他的路径被删除。
正向搜索过程:
首先进行搜索,这要保证可以找到最短路径,最短路径竞争过其他路径。
这里优化链表结构,在第一个节点即断点原点后,依次按照的顺序连接四个节点,然后检索其中是否有障碍物或边界,去除该结点。
然后将链表下一个节点作为发散原点,重复上述操作,这样一直进行下去,直到找到了断点目标点停止。这时相当于从原点出发的所有路径按照顺序更新,所以最短路径出现在链表里,并竞争过了所有路线。
反向剪切过程:
得到上述的链表后,我们要剪切出最短路径,这就需要知道每个节点是由哪个节点发散出来的。
所以链表每个node的元素还需包含一个父级发散点的索引。
其中是指向下个节点的指针,是该点的发散点在整个链表中的索引。
那么反向剪切的过程就是从断点目标点开始,将链表中的点的设置为当前节点的地址,然后反向传播,直到到达断点原点。