搜索专题
一.DFS
1.递归
小练手
**
输出1到n的所有排列,要求按照字典序从到
输出。**
输入
3
输出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
1 |
|
2.深度优先搜索
小练手
给定一个n行m列的迷宫,0代表障碍物,1代
表可以行走的区域。
每次可以朝着上下左右4个方向移动
起点在迷宫的左上⻆,终点在迷宫的右下⻆,问是否存在一条路径从起点到终点。
输入
3 6
100100
110111
011101
000011
输出
YES
1 |
|
一道经典老题。
1 |
|
反思:
这道题并不难,但是想要一次AC并不容易,用for循环进行判断的话只能得90分。所以要想其他判断方法,如用数组进行判断:如果(x1,y1)与(x2,y2)共线,x1-x2=y1-y2 => x1-y1=x2-y1 或 x1-x2=y2-y1 => x1+y1=x2+y2;
3.迭代加深搜索
实质还是一种DFS。迭代加深搜索本质上还是一种DFS,只不过每次给DFS的层数加上了限制。每次搜到指定的层数,即使能继续往下搜索也不再向下了,而是回溯回去。指定的层数依次增加,知道找到最优解。
小练手
跳房子是大家小时候的体育游戏之一,游戏的规则简单易懂、具有可变性。我
们在地上画出一个个房子,然后扔石子,根据石子的落地位置确定跳到哪个
房子。我们将房子抽象为x轴上的连续的正整数坐标点,第i个房子的坐标为
i,并假设房子个数无限。
我们的游戏规则如下:
1. 石子落到房子内,记为H,我们可以跳到当前坐标的3倍坐标位置。
2. 石子落到房子外,记为O,我们需跳回当前坐标折半并向下取整的坐标位
置。
例如,初始在第1个房子,要想到达第6个房子,既可以HHHOO,也可以
HHOHO。
请你编一个程序,给出从第n个房子到第m个房子所需要的最少跳跃次数k和
石子的扔法。
若最少跳跃次数下存在多种扔法,则选取字典序最小的扔法。
输入
1 6
输出
5
HHHOO
1 |
|
作业:
**埃及分数Problem
在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理 数。如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的。
对于一个分数a/b,表示方法有很多种,但是哪种最好呢?
首先,加数少的比加数多的好,其次,加数个数相同的,最小的分数越大越好。
如: **19/45=1/3 + 1/12 + 1/180
**19/45=1/3 + 1/15 + 1/45 **
19/45=1/3 + 1/18 + 1/30
**19/45=1/4 + 1/6 + 1/180 **
19/45=1/5 + 1/6 + 1/18.
**最好的是最后一种,因为1/18比1/180,1/45,1/30,1/180都大。
给出a,b(0〈a〈b〈1000),编程计算最好的表达方式。 ****Input
第一行:N 表示有N组测试数据,每组测试数据为一行包a,b(0〈a〈b〈1000)。**
**Output
每组测试数据若干个数,自小到大排列,依次是单位分数的分母。 **
Sample Input
1
19 45
Sample Output
5 6 18
二.BFS
1. 广度优先搜索
小练手
国际象棋中,马的走法为日字形,n*m的棋盘中有k个障碍物,马不能跳到这些上面,求从给定起点跳到终点的最短步数。
2. 双向BFS
BFS的时间复杂度随层数增加而呈指数递增,双向BFS能极大的优化时间复杂度
小练手
给定一个n行m列的迷宫,0代表障碍物,1代
表可以行走的区域。
每次可以朝着上下左右4个方向移动
起点在迷宫的左上⻆,终点在迷宫的右下⻆,问
最少走多少步能够走到迷宫的终点?
1 |
|
注意
在双向BFS中,两个方向同扩一个点等同于同时扩一层。
三.搜索的优化小技巧
- 搜索的顺序:从大到小或者从小到大排序之后再进行搜索,可能会达到意想不到结果。
- 最优化剪枝:如果当前的步骤加上后面都是最优的选择,还不能已有的答案更优就直接退出。
- 可行性剪枝的应用。
- 不同的题有不同的优化技巧,需要大家自己领会
任务
如果两个相邻像素灰度的差值不超过M,这两个像素就算同个区
域。如果像素a和像素b是1个区域,像素b和像素c是1个区域,那么a和
c也是1个区域请注意,若两个相邻像素灰度的差值1于M,也未必不是1个区域。
给定1个灰度图和M,问这个图像可以分割成多少个不同的输入
3 4 1
2 0 0 0
0 0 2 2
0 0 2 2
**输出**
3
四.模拟退火
模拟退火算法描述:
若J( Y(i+1) )>= J( Y(i) ) (即移动后得到更优解),则总是接受该移动
若J( Y(i+1) )< J( Y(i) ) (即移动后的解比当前解要差),则以一定的概率接受移动,而且这个概率随着时间推移逐渐降低(逐渐降低才能趋向稳定)
任务
搜索测试反思
1.ping
这道题与跳石头(P2678)类似,用二分答案就能AC。
1 |
|
教训:
以后码完代码,在提交前一定要检查freopen写对没!!!,血的教训!!
2.map
这道题并不难,因为边长为一,所以不必用spfa或Dijkstra,直接用BFS一层一层的更新顺带记录一下次数就行了。
1 |
|
教训:每道题两个代码,一个暴力,一个算法,对拍。
3.move
第三题才是重头戏。
有两种思路:
1.重构图,像网络流一样,分点,将点分为k+1个。
1 |
|
不过会有两个测试点TLE qwq.
2.状态转移,最短路+dis[v][i]=min(dis[u][i]+w,dis[u][i+1]);(dis[i][j]表示到i点,还有k次免费没用时的最短路径)
1 |
|
最后更新: 2023年09月02日 04:06:21
本文链接: http://syrsteven.github.io/post/c4637555.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可,转载请注明出处!