posts - 12,  comments - 31,  trackbacks - 0

把最近遇到的搜索好题列一下(推荐做做)。

http://acm.pku.edu.cn/JudgeOnline/problem?id=2286
The Rotation Game
迭代深搜,中等难度。
一开始用广搜做,结果MLE(当然有可能程序写错),改成迭代深搜后,因为不用考虑判重,不用写状态压缩,程序变的特别简单,再加上一个剪枝后就过了。
剪枝:(8 - 中间8个格最多的数字的个数)> 剩余步数,则剪枝

POJ 2286


http://acm.pku.edu.cn/JudgeOnline/problem?id=1184
聪明的打字员
称之为广搜,可这题真的是不那么好做啊。

一开始,广搜,TLE;然后双广,TLE;然后A*,TLE,当然有可能启发函数太次了。
最后请教oyjpArt,才明白有那么猛的的算法。

大概思路是把所有操作分两类,一类是置换类,就是只是交换数字位置、移动光标位置,二类是加减类,就是对每个数字加1减1。
然后广搜也是分两步,先搜所有的置换,再“搜”所有的加减。
1、先说第二步,“搜”加减,很简单,每个数字相差几就是几步,加起来就是最小步数。
2、第一个搜,要记录置换的当前状态,光标状态,还有光标曾经过的数字的初始位置(用6位2进制存储,记录这个意思就是说只要经过的数字,以后就允许加减,一气呵成)
。。。写不明白
POJ 1184


http://acm.pku.edu.cn/JudgeOnline/problem?id=1376
Robot
广搜,容易。
后来加一个启发函数进去,是这样定义的:H(n) = 到目标横向距离 / 3 + 到目标纵向距离 / 3 ,除以3是因为一步可以走3个格子,结果比原来的还要慢。

 

POJ 1376


http://acm.pku.edu.cn/JudgeOnline/problem?id=2449
Remmarguts' Date
求S到T的K短路,数据量N=1000,M=100000,K=1000。较难

1、用优先队列做广搜,当然跟一般广搜不一样,每个点允许k次出列,第k次出列的T点即是解。(理论上可行,但是实际确MLE超内存)
2、加入启发式函数H——到T的最短距离,传说中的A*就是这样来的。显然 这个最短距离 < i 短距离,满足条件,重要的是事实证明效果很不错。
参考:http://acm.pku.edu.cn/JudgeOnline/showcontest?contest_id=1144
POJ 2449


http://acm.pku.edu.cn/JudgeOnline/problem?id=1011

Sticks
剪枝好题,中等难度

两个强剪枝
1、如果长度为5的木棍刚好能满足当前块,就没必要尝试用2+3的木棍
2、如果当前块为空,则可指定任意一根木棍放入其内,也没必要尝试其他木棍
POJ 1011