kuangbin专题一 简单搜索 题解思路

近来想起来补一下基础,确实从基础题里还能学到很多,搜索这方面更是自己所欠缺的,总结一下简单搜索的结题思路。

A - 棋盘问题 - POJ 1321
思路:
不规则棋盘上的八皇后问题,回溯检查一下即可。

B - Dungeon Master POJ - 2251
思路:
三维的迷宫,向六个方向bfs,跟平面迷宫一样。

C - Catch That Cow POJ - 3278
思路:
1xN 的坐标上固定终点,求从起点到终点的最少步骤,每次+1或-1或坐标*2。
由于出现过坐标*2的操作,因此可能出现接近MAXN*2的位置,因此数组至少要开两倍。然后bfs即可。

D - Fliptile POJ - 3279
思路:
很有意思的题目,现在只会最普通的做法= =。
用dp的思想去考虑,如果上面的若干行全为0,那么考虑将下面的一行也全变为 0 ,最终全部变为 0 。
具体过程就是根据 i-1 行,调整 i 行的操作,使得 i-1 行全变为 0,一直计算到结尾,检查是否全为0。容易发现,当第一行的 1,0分布固定时,后面的所有操作都应是固定的,题目要求求出求出最小字典序,那么利用位运算枚举第一行的所有 1, 0分布,暴力求出答案即可。

E - Find The Multiple POJ - 1426
思路:
给出一个<200的数字 n ,求一个仅有 1 和 0 构成的十进制数 x,x|n 。
应有严格证明(此处没有)证明 x 必然在1e19范围内,不需要用到大整数。
利用到搜索的一点思想:
当 x 不能整除时,入队的是x*10和 x*10+1,因为小于10*x的所有枚举在前面的阶已被求过了。

F - Prime Path POJ - 3126
思路:
求一个五前导零的四位数到另一个四位数的最少变换次数。要求:
每次变换一个位上的数字,要求变换出来的数字为质数。
那么用a[5]保存一下,同样是简单bfs得出答案。

G - Shuffle’m Up POJ - 3087
思路:
单向搜索,用到记忆化,用map存一下状态是否出现过,参见博客
http://blog.csdn.net/joovo/article/details/78671430

H - Pots POJ - 3414
思路:
水壶倒水问题,要打印路径,比另一个非常可乐稍微繁琐一点。
倒水操作利用模拟实现,bfs,关键在于打印路径,需要在node节点里加入一个指针,每次bfs的时候都要将后一个状态指向前一个状态,那么在得到终止状态时,从终止状态迭代到初始状态即可,可以利用栈输出。
注意有六种状态,用for循环和数组优化代码量比较好。

I - Fire Game FZU - 2150
思路:
题目要求最少燃烧的时间,由于数据量很小,先判断是否为两个联通块,再暴力每个点为起点开始bfs,得出最优答案。

J - Fire! UVA - 11624
思路:
有障碍,和蔓延的火势的迷宫。
由于火焰在不断蔓延,那么就考虑将火焰和人一起push进队列bfs就完美解决问题。需要注意考虑火先移动,所以先 push Fire.

K - 迷宫问题 POJ - 3984
思路:
暴力bfs

L - Oil Deposits HDU - 1241
思路:
经典油田勘探问题,dfs求连通块

M - 非常可乐 HDU - 1495
思路:
详见博客,存在特殊性可以数论解法。
http://blog.csdn.net/Joovo/article/details/78661761

N - Find a way HDU - 2612
思路:
图上存在两个起点,多个终点。要求在一个终点相遇,求两人时间总和最短。
本来想从多个终点开始向两个起点bfs,但是T了。
后来想想从两个起点开始bfs,遇到终点就存一下该终点的时间,然后遍历所有终点求最优解。这样只需要2*bfs+遍历图 即 N

总结:
简单搜索转换到最后,都是单源多源的问题,优化问题,打印路径。
不能一心想着搜索,状态转移,有时候先从题目自身入手,优化完再打。
当然还有很多题型这里面没有,一些剪枝。

你可能感兴趣的:(kuangbin系列,搜索)