广度优先搜索——字符串替换
来源:互联网 发布:变魔术的软件 编辑:程序博客网 时间:2024/05/28 15:19
经典的字符串转换问题:http://codevs.cn/problem/1099/
昨天刚学了广度搜索,今天就用上了,一开始百度了一下,看到所有人都是在用双向广度搜索,现在还是很不明白双向的原理,居然不需要判重!!!速度快这个容易理解,好吧,骚年加油,今天ccf认证考试,明天再来学双向的!
首先说说这个吧,广度搜索最关键的还是这两个点:
1. 如何建立搜索树?
2. 如何判断状态重复?
第一,每个结点的状态如何延伸呢?在这个问题里,当然是字符串的查找,每找到一个可以被替换的位置,那么就是一个可延伸的状态了。一开始我逗比,每次只查找了一次,后来wa了一下,定睛一看,原来是忽略了串中有多个可以被替换的情况,这些可替换的位置,也是需要被延伸的状态,所以就加了一个while循环,一切搞定!!!
第二,如何判断结点重复呢?字符串hash化我怕会出错,所以就用了一个set来存储状态!set就不用多说了吧……
一些细节:
1. 要注意题中的规则输入的可能是多个目标,比如abc->def,abd->123之类的,我一开始用map存储这些规则,然后当然就出错啦,解决办法简单的就是使用multimap,multimap的插入,删除和查找都与map相似,都又有所不同,比如插入不可以用下标来做,而是需要用insert成员函数!删除则是删除所有关键字相同的元素,查找时若找到,只返回同个关键字中的第一个的迭代器……
2. state数组是用来存储状态的(因为set会自动排序,会打乱要计算的状态的顺序,所以得用多一个数组来存储)。那么数组的大小怎么确定呢?我还不会计算……最后第二次提交时爆了,,,,改大一点就好了……哎,数学方面也得跟上来呀,不能只学算法思想!
#include <iostream>#include <string>#include <map>#include <set>using namespace std;string goal;multimap<string, string> M;map<string, int> N;set<string> col;const int Max = 900000;//?how manystring state[Max];void Init();int bfs();int main(){Init();int ans = bfs();if(ans == -1) cout << "NO ANSWER!" << endl;else cout << ans << endl;return 0;}void Init(){cin >> state[0] >> goal;string p, q;while(cin >> p >> q)M.insert(make_pair(p, q));}int bfs(){int head = 0, tail = 1;size_t pos;N[state[head]] = 0;map<string, string>::iterator it;while(head < tail){if(N[state[head]] > 10){++head;continue;}if(state[head] == goal){if(N[goal] > 10) return -1;return N[goal];}for(it=M.begin(); it!=M.end(); ++it){state[tail] = state[head];pos = state[tail].find(it->first);while(pos != string::npos){state[tail].replace(pos, it->first.size(), it->second);if(col.find(state[tail]) == col.end()){col.insert(state[tail]);N[state[tail]] = N[state[head]] + 1;++tail;}state[tail] = state[head];pos = state[tail].find(it->first, pos+it->first.size());}}++head;}return -1;}
- 广度优先搜索——字符串替换
- 搜索——广度优先搜索
- 迷宫——广度优先搜索
- BFS广度优先搜索——入门
- 广度优先搜索——01迷宫
- 广度优先搜索——BFS遍历
- 图——广度优先搜索(Graph
- 广度优先搜索算法—BFS
- 图搜索——深度优先与广度优先
- 广度优先、深度优先搜索算法——LeetCode
- 广度优先搜索BFS——图邻接表表示
- 广度优先搜索BFS——图邻接矩阵表示
- 图的遍历——广度优先搜索
- 广度优先搜索——经典的8数码问题
- A*算法——启发式的广度优先搜索
- 二叉树的最小深度——广度优先搜索
- 杭电ACM1072——Nightmare~~广度优先搜索
- 八数码问题——双向广度优先搜索解决
- Java数据结构和算法(三)——简单排序
- 并发编程之GCD
- 实例学习gcc+gdb+make
- 腾讯qq2015正式版 v6.2 官方版
- WPF 几种常用控件样式的总结
- 广度优先搜索——字符串替换
- 【codeforces】 468A 24 Game
- Android高效加载大图、多图解决方案,有效避免程序OOM
- 常见算法在实际项目中的应用
- 【raviramamoorthi-Computer Graphics】OpenGL1:Drawing
- 生活就是会开一些不经意的玩笑,给你转个弯,绊个道,然后给你不一样的视角。有些人很幸运发现了,有些人一辈子在无视。然后忆往昔,恨当下。把一切都怪给命运。
- Activity简介
- 年轻工程师为何只能卖个“白菜价”?
- 【比特币】脑钱包