题意:
给定一个起点和终点,还有一个图,在图上"."的点,可以花1s的时间走完,如果该点上是一个数,则需要花该数的时间,在该点打败怪兽,给出从起点到终点的所需要的最短的时间。具体输出描述请看题目hdu 1026。
解题思路:
典型的宽搜题,稍微麻烦点的是,需要在宽搜的时候记录路径,我是采用了记录上一步是从哪个点来的方式。也可以用数组记录下每条线路的整个路径,不过需要很大的空间,还需要一些代码上的优化,我觉得还是记录父亲节点的方式时间和空间的效率更高。
至于具体的搜索方法,可以在网上搜到很多具体的教程,我就不献丑了,肯定讲的没那些教案全。我的理解是,每次拓展一层节点,比如一开始只能在(0,0)点,有4个方向可以走,将确实可以走的点,记录下来,加入宽搜的数组。这样在这层就有了0~4个可以拓展的点,每个点扩展一遍,就可能有0~16个点,这样循环下去。最终搜出了所有到达终点的路径,加一些剪枝判断就可以大量减少需要添加的点。这是非常显著的,比如你在第一层少加了一个没有价值的点,以后如果有10层,就少了4^10次的操作和更多的空间。这样的优化方法有很多,但是因为这题需要把所有路径搜出来作为比较,不能采用一些方向上的贪心优化,因为不可以一找到结果就退出。
如果大家有问题,欢迎提问。
代码:
#include <iostr