题目分析



来源:acwing

分析:

双向广搜主要用在最小步数模型(也称状态图模型)里面,这里整个状态空间一般是指数级别的,用双向广搜可以极大地提高运行效率。

双向广搜,顾名思义,就是从起点和终点都进行bfs搜索,然后两者相遇的话,就代表找到了合适的从起点到终点的路径。下图展示了起点A和终点B之间能搜到的最小步数的计算过程。

  1. 双向广搜需要2个哈希表,unordered_map<string, int> da, db; ,分别记录从起点状态(状态:这里是字符串)到中间某状态的最小步数,从终点状态到中间某状态的最小步数。最终的答案就可以通过相加的方式来求。
  2. 双向广搜同样需要两个队列,q[a]和q[b],来分别进行bfs。当两个队列里面同时有值的时候:while(qa.size() && qb.size()),再进行扩展搜索;如果有1个为空,说明从起点到终点是不可达的,也就是无解的。
  3. 这里用一个标志位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相关推荐

  1. 算法提高课-搜索-最短路模型-AcWing 1100. 抓住那头牛:bfs

    题目分析 来源:acwing 分析:bfs求最短步数,需要dist[]数组来记录最短步数. ac代码 #include<bits/stdc++.h> using namespace std ...

  2. 算法提高课-搜索-最短路模型-AcWing 188. 武士风度的牛 :bfs、dist数组记录最小步数

    题目分析 来源:acwing 分析:马走日,这里用bfs遍历马的行走过程,输出到达终点的最小步数. 使用bfs求到每个点的最小步数,需要开一个dist[][]数组,来记录起点到某点的最小步数. 队列里 ...

  3. 算法提高课-搜索-最小步数模型-AcWing 1107. 魔板:bfs、复杂、八数码类似的题目

    题目分析 来源:acwing 分析: 最小步数模型常用哈希 按照ABC的顺序来搜,得到的是字典序最小的. 这里整幅"图"是一个状态, 装进一个字符串中,然后一个状态改变到另一个状态 ...

  4. 算法提高课-搜索-最短路模型-AcWing 1076. 迷宫问题:bfs最短路、路径

    题目分析 分析: bfs求最短路,主要原因是因为bfs是一层一层的搜,当第一次搜到终点的时候,其实就是到终点的最短路. 本题bfs倒着搜,从终点(n-1,n-1)开始搜,记录到每个点的路径nxt[][ ...

  5. noip2002 字串变换 (双向宽搜,交替扩展)

    P1124字串变换 Accepted 标签:搜索 搜索与剪枝NOIP提高组2002 描述 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -& ...

  6. 算法提高课-搜索-双端队列广搜-AcWing 175. 电路维修:deque、bfs、有点难

    题目分析 来源:acwing 只有边权为0和边权为1,两种情况.什么意思呢?两个点之间存在路径则边权为0,需要转一下连通的边权为1. 每个点可能入队多次,本质上是个dijkstra算法. 下图说明bf ...

  7. 算法提高课-搜索-DFS之搜索顺序-AcWing 1116. 马走日:dfs

    题目分析 来源:acwing 分析: dfs分两类,一类是内部搜索,不需要恢复现场:一类是外部搜索(以整个图作为状态),需要恢复现场.这里的马走日就是状态图,需要恢复现场. 理清dfs,需要画一个搜索 ...

  8. 算法提高课-搜索-A*(A star)算法-AcWing 179. 八数码:A星算法求解

    题目分析 来源:acwing 分析: A*算法是什么呢? A算法是一种bfs的变式,需要用到一个"估价函数",用来计算任意状态到目标状态所需代价的估计值.然后在搜索中,维护一个堆, ...

  9. 算法提高课-搜索-DFS之搜索顺序-AcWing 1117. 单词接龙:dfs

    题目分析 来源:acwing 分析:外部dfs,需要状态恢复. 字符串a的后k的字母 和字符串b的前k个字母是否相同,用substr函数判断:if(a.substr(a.size() - k, k) ...

最新文章

  1. ASP.NET运行原理
  2. BZOJ2588 Count on a tree DFS序+LCA+值域主席树
  3. CSS选择器、盒子模型及布局
  4. mongodb3.2 java,MongoDB学习笔记:(3)、mongodb 3.2在java环境中的简单CRUD
  5. 基于Python+Django的Kubernetes集群管理平台
  6. html预览不出效果是怎么回事,为何HTML文件直接双击打不开 要用浏览器才能打开 之前双击还能打开显示效果的...
  7. Dorado 7.1.20 发布,Ajax的Web开发平台
  8. qunit 前端脚本测试用例
  9. java使用密文链接数据库_Java基础——数据库连接信息使用密文
  10. Java第11次作业
  11. html css 忽略,HTML与CSS中易被忽略的基础知识点
  12. 餐饮系统店家后端基础功能构建
  13. [词根词缀]fer/ferv/fid/fig/fin/firm/fix词根由来
  14. 前端html + js视频播放器(快进,快退,倍速,全屏等功能)
  15. React中组件通信的几种方式
  16. 瞄准托育供需矛盾,提供优质教育产品和普惠服务
  17. 【托业】【怪兽】TEST02
  18. 2019 年全球云计算市场份额出炉
  19. 南大通用:元宇宙数据库技术展望
  20. 仿射密码(C语言实现)

热门文章

  1. 创建JAVASCRIPT对象3种方法
  2. 有备无患的Linux操作系统备份方法
  3. mysql两列数据去重_CiteSpace多数据库一键去重4.0-知网、万方、维普数据库
  4. python中的join函数连接dataframe_python pandas DataFrame.join用法及代码示例
  5. android 分支管理,Android Studio git使用,包括协同开发,分支管理。
  6. 【UGV】从单个麦轮受力到麦轮小车运动学分析
  7. 雅客EXCEL(2)-数据、文本格式
  8. 窗口移到屏幕边上拉不出来解决办法
  9. 【S操作】老铁留步,干货来了!小总结云存储云办公云笔记工具——我的云工具选择,供您参考...
  10. 【DIY】入门必看:arduino入门实用教程,esp8266获取互联网时间,nodemcu制作NTP客户端获取显示互联网时间...