数据结构 | 空间 | 是否具有最短路特性 | 备注 | |
---|---|---|---|---|
DFS | stack | O ( h ) O(h) O(h) | 否 | 通常要回溯、剪枝,对空间要求比较高的用DFS |
BFS | queue | O ( 2 h ) O(2^h) O(2h) | 是 | 最少步数、最短距离、最少操作几次 |
深搜(dfs)框架
参考:https://blog.csdn.net/weixin_45559159/article/details/104187523
void dfs(int x)//关于传入参数问题,根据题意而定,看在程序运行的过程中,哪些是在变的
{
if(满足输出条件)
{
输出解;
return ;
}
//剪枝操作
if(目前已经没有必要进行下去的条件){
return ;
}
//如果传入的条件,还需要继续搜下去,分析每一种情况后面跟哪些情况,然后循环,每个情况(注意前提:得符合题意)都深搜一下
for(int i=1;i<=每种情况数;i++)
if(满足进一步搜索条件)//判断是否合理
{
为进一步搜索所需要的状态打上标记;//是需要的状态
dfs(t+1);
恢复到打标记前的状态;//也就是说的{回溯一步}
}
}
}
DFS最重要的就是要考虑搜索顺序
每个题目最好画一下递归搜索树,便于理解
例题一:(输出不同方案,也可输出方案的总数)
AcWing 842. 排列数字【DFS】
例题二:(输出不同方案,也可输出方案的总数)
AcWing 843. n-皇后问题【DFS】【剪枝】
例题三:(输出不同方案,也可输出方案的总数)
AcWing 92. 递归实现指数型枚举【DFS】【递归】
例题四:(输出不同方案,也可输出方案的总数)
AcWing 94. 递归实现排列型枚举【DFS】【递归】
例题五:(输出不同方案,也可输出方案的总数)
AcWing 93. 递归实现组合型枚举【DFS】【递归】
例题七:(不同的方案数)
AcWing 1209. 带分数【DFS】【递归】【剪枝】【第四届蓝桥杯省赛C++B/C组,第四届蓝桥杯省赛JAVAA/B组】
例题八:(从初始位置出发能到达的瓷砖数、FloodFill)
AcWing 1113. 红与黑【《信息学奥赛一本通》】【DFS】【BFS】【Flood Fill】
例题九:(连通块的个数、FloodFill)
AcWing 1233. 全球变暖【FloodFill】【BFS】【DFS】
例题十:(最多花费的路费是多少)
AcWing 1207. 大臣的旅费【第四届蓝桥杯省赛C++A组,第四届蓝桥杯省赛JAVAA组】【树的直径】【BFS】【DFS】【树形DP】
例题十一:(从起点坐标到终点坐标的方案总数)
洛谷 P1605 迷宫【搜索】【DFS】【BFS】
例题十二:(输出所有可行的路径,即所有不同方案)
洛谷 P1238 走迷宫【搜索】【DFS】
宽搜(bfs)框架
一、 判重数组st[] 一般入队时判重(保证每个点只会入队一次,从而保证时间复杂度是线性的) (特殊情况出队时判重,如A*算法、Dijkstra算法)
二、 queue
1. queue ← \leftarrow ← 初始状态
2. while (queue非空)
{
t ← \leftarrow ← 队头元素
队头元素出队列
for (扩展t)
{
ver ← \leftarrow ← 新节点
if (!st[ver])
{
ver → \rightarrow → 队尾
}
}
}
宽搜(bfs)本质
是从一个状态扩展到另一个状态
。不同宽搜题目的不同点
在于状态的定义
上
主要有两大类
, 第一类
是走迷宫类
问题,矩阵的每一个格子
是一个状态;第二类是八数码、数独类
问题,整个矩阵(一个数组)
是一个状态,每次枚举它能变成什么状态
例题一:(最少移动次数)
AcWing 844. 走迷宫【BFS】
例题二:(最少交换次数)
AcWing 845. 八数码【BFS】
例题三:(最少需要多少时间就能吃到奶酪)
AcWing 1101. 献给阿尔吉侬的花束【《信息学奥赛一本通》】【bfs】【bfs框架】
例题四:(从初始位置出发能到达的瓷砖数、FloodFill)
AcWing 1113. 红与黑【《信息学奥赛一本通》】【DFS】【BFS】【Flood Fill】
例题五:(逃脱所需最短时间)
AcWing 1096. 地牢大师【《信息学奥赛一本通》】【三维地图BFS】
例题六:(连通块的个数、FloodFill)
AcWing 1233. 全球变暖【FloodFill】【BFS】【DFS】
例题七:(最多花费的路费是多少)
AcWing 1207. 大臣的旅费【第四届蓝桥杯省赛C++A组,第四届蓝桥杯省赛JAVAA组】【树的直径】【BFS】【DFS】【树形DP】
例题八:(从起点坐标到终点坐标的方案总数)
洛谷 P1605 迷宫【搜索】【DFS】【BFS】