`
coolsooner
  • 浏览: 1315094 次
文章分类
社区版块
存档分类
最新评论

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*,有点长):



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics