算法提高课-搜索-双向广搜 AcWing 190. 字串变换:bfs、双向bfs、queue和unordered_map
题目分析
来源:acwing
分析:
双向广搜主要用在最小步数模型(也称状态图模型)里面,这里整个状态空间一般是指数级别的,用双向广搜可以极大地提高运行效率。
双向广搜,顾名思义,就是从起点和终点都进行bfs搜索,然后两者相遇的话,就代表找到了合适的从起点到终点的路径。下图展示了起点A和终点B之间能搜到的最小步数的计算过程。
- 双向广搜需要2个哈希表,unordered_map<string, int> da, db; ,分别记录从起点状态(状态:这里是字符串)到中间某状态的最小步数,从终点状态到中间某状态的最小步数。最终的答案就可以通过相加的方式来求。
- 双向广搜同样需要两个队列,q[a]和q[b],来分别进行bfs。当两个队列里面同时有值的时候:
while(qa.size() && qb.size())
,再进行扩展搜索;如果有1个为空,说明从起点到终点是不可达的,也就是无解的。 - 这里用一个标志位t来记录 双向广搜是否相遇。
ac代码
#include<bits/stdc++.h>
using namespace std;
const int N = 6;
int n;
string a[N],b[N];
// 扩展函数
// 参数:扩展的队列,到起点的距离,到终点的距离,规则,规则
//返回值:满足条件的最小步数
int extend(queue<string>& q, unordered_map<string,int>& da, unordered_map<string, int>& db,string a[], string b[]){// 取出队头元素string t = q.front();q.pop();for(int i = 0; i < t.size(); i ++) // t从哪里开始扩展for(int j = 0; j < n; j ++) // 枚举规则//如果t这个字符串的一段= 规则,比如= xyz,才可以替换if(t.substr(i, a[j].size()) == a[j]){// 变换之后的结果state:前面不变的部分+ 变化的部分 + 后面不变的部分// 比如abcd ,根据规则abc--> xu,变成 xud,这里的state就是xudstring state = t.substr(0,i) +b[j] + t.substr(i + a[j].size());// state状态是否落到b里面去,两个方向会师,返回最小步数if(db.count(state)) return da[t] + 1 + db[state];// 如果该状态之前已扩展过,if(da.count(state)) continue;da[state] = da[t] + 1;q.push(state);}return 11;}
// 从起点和终点来做bfs
int bfs(string A, string B){queue<string> qa, qb; // 两个方向的队列//每个状态到起点的距离da(哈希表),每个状态到终点的距离db哈希表unordered_map<string, int> da, db; // qa从起点开始搜,qb从终点开始搜qa.push(A), da[A] = 0; // 起点A到起点的距离为0qb.push(B), db[B] = 0; // 终点B到终点B的距离为0// qa和qb都有值,说明可以扩展过来,否则说明是不相交的while(qa.size() && qb.size()){int t; // 记录最小步数// 哪个方向的队列的长度更小一些,空间更小一些,从该方向开始扩展,// 时间复杂度比较平滑,否则有1个点会超时if(qa.size() <= qb.size()) t = extend(qa, da, db, a, b);else t = extend(qb, db, da, b, a);// 如果最小步数在10步以内if( t <= 10) return t;}return 11; // 如果不连通或者最小步数>10,则返回大于10的数}int main(){string A, B;cin >> A >> B;// 读入扩展规则,分别存在a数组和b数组while( cin >> a[n] >> b[n]) n ++;int step = bfs(A,B);if(step > 10) puts("NO ANSWER!");else cout << step << endl;
}
题目来源
https://www.acwing.com/problem/content/192/
算法提高课-搜索-双向广搜 AcWing 190. 字串变换:bfs、双向bfs、queue和unordered_map相关推荐
- 算法提高课-搜索-最短路模型-AcWing 1100. 抓住那头牛:bfs
题目分析 来源:acwing 分析:bfs求最短步数,需要dist[]数组来记录最短步数. ac代码 #include<bits/stdc++.h> using namespace std ...
- 算法提高课-搜索-最短路模型-AcWing 188. 武士风度的牛 :bfs、dist数组记录最小步数
题目分析 来源:acwing 分析:马走日,这里用bfs遍历马的行走过程,输出到达终点的最小步数. 使用bfs求到每个点的最小步数,需要开一个dist[][]数组,来记录起点到某点的最小步数. 队列里 ...
- 算法提高课-搜索-最小步数模型-AcWing 1107. 魔板:bfs、复杂、八数码类似的题目
题目分析 来源:acwing 分析: 最小步数模型常用哈希 按照ABC的顺序来搜,得到的是字典序最小的. 这里整幅"图"是一个状态, 装进一个字符串中,然后一个状态改变到另一个状态 ...
- 算法提高课-搜索-最短路模型-AcWing 1076. 迷宫问题:bfs最短路、路径
题目分析 分析: bfs求最短路,主要原因是因为bfs是一层一层的搜,当第一次搜到终点的时候,其实就是到终点的最短路. 本题bfs倒着搜,从终点(n-1,n-1)开始搜,记录到每个点的路径nxt[][ ...
- noip2002 字串变换 (双向宽搜,交替扩展)
P1124字串变换 Accepted 标签:搜索 搜索与剪枝NOIP提高组2002 描述 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -& ...
- 算法提高课-搜索-双端队列广搜-AcWing 175. 电路维修:deque、bfs、有点难
题目分析 来源:acwing 只有边权为0和边权为1,两种情况.什么意思呢?两个点之间存在路径则边权为0,需要转一下连通的边权为1. 每个点可能入队多次,本质上是个dijkstra算法. 下图说明bf ...
- 算法提高课-搜索-DFS之搜索顺序-AcWing 1116. 马走日:dfs
题目分析 来源:acwing 分析: dfs分两类,一类是内部搜索,不需要恢复现场:一类是外部搜索(以整个图作为状态),需要恢复现场.这里的马走日就是状态图,需要恢复现场. 理清dfs,需要画一个搜索 ...
- 算法提高课-搜索-A*(A star)算法-AcWing 179. 八数码:A星算法求解
题目分析 来源:acwing 分析: A*算法是什么呢? A算法是一种bfs的变式,需要用到一个"估价函数",用来计算任意状态到目标状态所需代价的估计值.然后在搜索中,维护一个堆, ...
- 算法提高课-搜索-DFS之搜索顺序-AcWing 1117. 单词接龙:dfs
题目分析 来源:acwing 分析:外部dfs,需要状态恢复. 字符串a的后k的字母 和字符串b的前k个字母是否相同,用substr函数判断:if(a.substr(a.size() - k, k) ...
最新文章
- ASP.NET运行原理
- BZOJ2588 Count on a tree DFS序+LCA+值域主席树
- CSS选择器、盒子模型及布局
- mongodb3.2 java,MongoDB学习笔记:(3)、mongodb 3.2在java环境中的简单CRUD
- 基于Python+Django的Kubernetes集群管理平台
- html预览不出效果是怎么回事,为何HTML文件直接双击打不开 要用浏览器才能打开 之前双击还能打开显示效果的...
- Dorado 7.1.20 发布,Ajax的Web开发平台
- qunit 前端脚本测试用例
- java使用密文链接数据库_Java基础——数据库连接信息使用密文
- Java第11次作业
- html css 忽略,HTML与CSS中易被忽略的基础知识点
- 餐饮系统店家后端基础功能构建
- [词根词缀]fer/ferv/fid/fig/fin/firm/fix词根由来
- 前端html + js视频播放器(快进,快退,倍速,全屏等功能)
- React中组件通信的几种方式
- 瞄准托育供需矛盾,提供优质教育产品和普惠服务
- 【托业】【怪兽】TEST02
- 2019 年全球云计算市场份额出炉
- 南大通用:元宇宙数据库技术展望
- 仿射密码(C语言实现)
热门文章
- 创建JAVASCRIPT对象3种方法
- 有备无患的Linux操作系统备份方法
- mysql两列数据去重_CiteSpace多数据库一键去重4.0-知网、万方、维普数据库
- python中的join函数连接dataframe_python pandas DataFrame.join用法及代码示例
- android 分支管理,Android Studio git使用,包括协同开发,分支管理。
- 【UGV】从单个麦轮受力到麦轮小车运动学分析
- 雅客EXCEL(2)-数据、文本格式
- 窗口移到屏幕边上拉不出来解决办法
- 【S操作】老铁留步,干货来了!小总结云存储云办公云笔记工具——我的云工具选择,供您参考...
- 【DIY】入门必看:arduino入门实用教程,esp8266获取互联网时间,nodemcu制作NTP客户端获取显示互联网时间...