HDOJ 1044

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1044

        题意有点类似于红白机上玩过的吃豆子游戏,呵呵。在规定的时间内逃出迷宫,并带走丢在路上的宝石们,价值尽可能的大。

       最直接的想法是以宝石为结点,DFS暴力搜索,这样首先需要求俩宝石的最短路径,用A*算法。

       然后就TLE……

       然后剪枝吧,比如从A点出发,如d(AC) == d(AB) + d(BC),那么C点是已经搜索过,continue。并且用了贪心策略,按离当前点的距离远近排序待搜索的结点。

       然后继续TLE……

       然后反省,是不是我对自己写的A*算法太自信了,应该记录结点间的距离供以后查找。亦或是不是我的整个思路就是错的……

       开始不自信了,看解题报告……

       原来如此,思路没错,确实应该先纪录结点间的距离。

       再次submit,然后WA……

       又开始不自信了,难道把A*还是DFS错了?正当我准备用debug杀技——print大法时,浏览了一下代码,终于发现问题所在了——const int INF = 1000000这个INF是用来表示结点间不可达的情况,随手写了个100W,想想应该够大了吧,毕竟迷宫才50*50——再看题目,时间的范围正是100W……一怒之下后面加了0AC了。

       早知要纪录所有结点间距离,也不用A*了,BFS更快。

       以下代码(因为用了A*,有点长):



你可能感兴趣的:(OJ)