简单搜索练习
kuangbin专题和洛谷专题的刷题记录,以及简单搜索总结
知识点
- BFS
- DFS
- 路径还原
白书例题(DFS + 简单剪枝)
给定整数a1、a2…、an,判断是否可以从中选出若干数,使他们的和恰好为k。
1 |
|
POJ1321(DFS,八皇后变式)
类似n皇后问题,区别在于某行可不放棋子
1 |
|
POJ2251(三维BFS)
简单扩展下二维BFS,用结构体表示坐标即可
1 |
|
POJ3278(非图类BFS)
其实这题就是步长不同的BFS
1 |
|
POJ3279(集合的整数表示 + 枚举)
感觉不像搜索……
需要枚举集合,用到集合的整数表示
第一行情况固定了,后面每一行的翻转情况也就确定了
我的方法比较傻,所以再贴一个白书上的题解
1 |
|
1 |
|
POJ1426(BFS + 思考)
再字符串后分别加0和1,然后判断余数,若余数没有出现过,则是一个新状态,加入队列
可以用除法列竖式来理解算法思路
1 |
|
POJ3126(素数筛 + 非图类BFS)
枚举改变一个数字后的所有状态,判断是否是素数,是素数则放入队列
1 |
|
POJ3087(打表 + 模拟?)
我已经想到一个绝妙的证明,可惜这里空间太小写不下(皮)
是道模拟题吧,不知道为什么归在搜索。编写很简单,但是证明了一个多小时还证不出来,题解也没有相关证明。
设a1,a2,…a2n
则新串b1,b2,…b2n
有bi =a (i & 1 ? i = (i + 1) / 2 : i / 2);
1 |
|
打表发现总有一个新i会等于旧i,也就是说,总会有bi = … = ai,
用反证法。设i0,i的范围为(0,2n],如果i0经过2n次变换,ik始终不等于i0,那么必定有个i出现了两次,而这个i一定由i0变化而来,所以i0 在变化中出现了循环,也即在2n次变换中,一定存在bi = … = ai。
但是思路有点问题,bi = … = ai所用的次数各不相同,无法证明所有的b和a相等……
看看学了离散和具体数学后有没有办法证明吧。
AC代码
1 | //不严谨,待证明 |
POJ3414(BFS + 思考)
参考自博客
https://blog.csdn.net/qq_41280600/article/details/102491233
新思路,变量结构体中一个值储存路径
1 | //新思路,bfs中,用变量记录每条路径 |
FZU2150(双点BFS)
1 | //连通集大于2个则输出-1 |
UVA11624(多点BFS)
F的初始位置有很多,用一个队列来存储F,j可达到的地方也用一个队列表示
然后就是双起点BFS了
1 |
|
POJ3984(DFS + 路径还原)
路径还原
我选择用一个栈同步DFS……
1 |
|
HDU1241(DFS求连通块)
简单的连通块搜索
1 |
|
HDU1495(BFS + 枚举 + 思考)
枚举倒完水后各个容器内水的体积,然后BFS即可
1 |
|
HDU2612(两点BFS)
可能有的@点无法到达,要排除
两个BFS,把结果相加即可
1 | //简单bfs |
洛谷P1219(DFS,经典八皇后问题)
经典n皇后问题
1 |
|
洛谷P1019(DFS,暴力)
注意linkstr()函数返回的应该是最小重叠部分,而非最大
注意开头的字符串也要标记使用过一次
1 |
|
洛谷P1101(单向DFS)
使用字符串常量
参数包含方向
1 |
|
洛谷P1605(DFS求路径数)
简单题
1 |
|
洛谷P1162(BFS求闭合圈)
先把边界预先染成其它颜色
染色时,先染色再push(),避免重复计算
1 |
|
洛谷P1141(BFS,染色)
读错题了orz,不是求从(x, y)所能达到的最远距离,而是从(x, y)所能达到的最多格子数
那么求连通集就好,一个连通集内,所能达到的地方相同
比如在学校是一个连通集,不管是从教学楼出发,还是从寝室出发,最终能到达的地方都是整个学校
- %1d这样的输入格式
- 小技巧,给d赋不同的值,然后映射ret
- ret数组不要开小了……
1 |
|
洛谷P1443(非上下左右移动的BFS)
改变方向数据即可
1 |
|
总结
何为搜索?
我接触的第一道搜索题是白书上的部分和问题
。是一道简单的BFS,当时由于对递归的理解不够,导致花了好多天才理解为什么要这么写。到我能真正写出DFS那是更后面的事了。
后来我会熟练地写地图上的搜索了,并天真地以为搜索就是指图的搜索。在一个图中给出入口出口,寻找最短路径或者求连通块便是搜索。我做了很多板子题,并自得其乐。洛谷P1101
,洛谷P1605
,洛谷P1162
,洛谷P1141
。
再后来逐渐接触一些稍微变形点的题,比如三维的啦POJ2251
,像马那样跳跃的啦洛谷P1443
,多点一起的搜索啦FZU2150
,UVA11624
,八皇后相关的啦洛谷P1219
,POJ1321
,路径还原啦POJ3984
,POJ3414
再后来,我就自闭了……因为发现这个时候剩下的题都是没什么思路的,它不是一个地图,我想象不出它的样子,无法把它们套进搜索的模型里。
好在随着时间的流逝,我也逐渐开窍了。懂得了地图只是搜索的一个很直观的表现。搜索是一个状态根据一个规则到达另一份状态,后者再根据同一个规则到达下一份状态,直至搜完所有的可能或者得到目标值,应该也是一种暴力的方法(莽夫的智慧)。而BFS还是DFS只是搜索策略的不同罢了。