【洛谷】P1032 字串变换
题目地址:https://www.luogu.org/problemnew/show/P1032
洛谷训练场BFS的训练题呀。
“BFS不就是用队列的思想去遍历一切情况嘛。我已经不是小孩子了,我肯定能做出来!”
A FEW MINUTES LATER
“QAQ我错了,这题怎么用BFS的思想呀。”
毫无头绪的我选择向题解求助。
/学习从来就不是一件容易的事情,但这可以做成一件让自己快乐的事情/
耐下心来,仔细阅读以及翻资料,终于看明白了ShawnZhou大牛的代码(以下粘贴的代码均是ShawnZhou大牛的代码,侵删)。
尝试总结一下知识点:
BFS、queue、map、以及字符串(string)的处理
题目有必定的两个字符串的输入——最初形态&最终形态;
然后下面就是状态的一一对应:x1 -> y1; x2 -> y2; ......
于是大牛这么构造这情况:
string a, b; // 最初形态&最终形态
string orginal[maxn];
string translated[maxn];
int n; // n = 0
//...
cin >> a >> b; // 输入把我看呆了,又学到了新姿势
while(cin >> orginal[n] >> translated[n]) n++;
BFS:
运用队列,这里遍历的情况是变化后的字符串与其所在的第i步后两种记录,所以大牛用到了pair的思想(只不过他这里用结构体,给我这小白真的太友好了)
这里map的剪枝个人觉得也是给我上了一门课——剪枝真的好神奇!map这STL tql!(map的详细介绍:http://www.cplusplus.com/reference/map/map/?kw=map)
结果,貌似真的如果大牛所说:一个平淡无奇的bfs过程
struct node{
string str;
int step;
};
void bfs(){
queue<node> q;
node s;
s.str = a;
q.push(s);
while(!q.empty()){
node u = q.front();
q.pop();
string temp;
if(ma.count(u.str) == 1) // 剪枝,判断重复的路径
continue;
if(u.str == b){
ans = u,step;
break;
}
ma[u.str] = 1;
for(int i = 0; i < u.str.length(); i++) // 枚举当前串所有可能位置
for(int j = 0; j < n; j++) { // 枚举所有可能手段
temp = trans(u.str, i, j); // 这个 trans() 是处理字符串的函数
if(temp != ""){
node v;
v.str = temp;
v.step = u.step + 1;
q.push(v);
}
}
}
}
trans()函数:
学到了新的知识 string 的 substr();(substr()详解:http://www.cplusplus.com/reference/string/string/substr/)
效果是判断该字符串是否满足条件变换,如果满足,则进行变换并把变换效果传进队列(bfs下面的if语句条件的方法体)
如果条件的长度比此时目标字符串的长度要长,无疑是不可能达成条件的,直接返回(第一个return)
然后逐一从字符串的目标那里开始与条件字符串的“0”位开始比较(bfs()第一个for语句就有逐一遍历原字符串的每个字符的效果——这个“原字符串”是指队列里每个元素的str),如果不满足每一个字符都相同则返回第二个return(效果跟第一个return一样)
最后进行的是对原字符串的转换(详细过程请读者大牛手动模拟一下吧,小白也说不清楚QUQ,dbq)。
string trans(const string &str,int i,int j){//借鉴了stdcall大爷的思想
string ans = "";
if (i+orginal[j].length() > str.length())
return ans;
for (int k=0; k < orginal[j].length();k++)
if (str[i+k] != orginal[j][k])
return ans;
ans = str.substr(0,i);
ans+=translated[j];
ans+=str.substr(i+orginal[j].length());
return ans;
}
最后贴一下完整的代码:ShawnZhou大牛的代码(喜欢的前往本题的题解为大牛点赞打call呀)
https://www.luogu.org/problemnew/solution/P1032
小白是某二本财经大学的科班学生,入坑时间晚,还是有很多东西要虚心向大牛们学习。
以后请多多指教/
【洛谷】P1032 字串变换的更多相关文章
- [洛谷P1032] 字串变换
洛谷题目链接:字串变换 题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B ...
- 洛谷 P1032 字串变换题解
题目链接:https://www.luogu.org/problem/P1032 题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1 ->B_1B1 A ...
- 洛谷 P1032 字串变换
题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...
- 洛谷 P1032 字串变换 (BFS)
题目传送门 我即使是死了,钉在棺材里了,也要在墓里,用这腐朽的声带喊出 STL大法好 这题最麻烦的其实是处理字符串,真正的搜索部分我个人认为也就只有橙题或黄题的难度.而处理字符串,正如前面所说,STL ...
- 洛谷 P1032 字串变换 题解
每日一题 day19 打卡 Analysis 广搜+map判重 用find寻找字串,再用replace替换字串 这里的map相当于正常广搜的一个book的作用 #include<iostream ...
- 洛谷P1032 字串变换【bfs】
题目链接:https://www.luogu.org/problemnew/show/P1032 题意: 给定一个原字符串和目标字符串,以及几个字符串变换的规则. 问能否根据这几个规则在十步之内把原字 ...
- 洛谷P1032 字串变换-题解
https://www.luogu.org/problemnew/show/P1032--(题目传送) 好在数据范围很小,暴力一点也能过.思路较简单,按照所有规则,从第一位开始广搜. 注意:1.str ...
- 洛谷 P1032 字串变换(map)
题目传送门 解题思路: 搜索题,因为要求最少次数,用bfs. AC代码: #include<cstdio> #include<iostream> #include<cst ...
- 集训作业 洛谷P1032 字串变换
集训的题目有点多,先写困难的绿题吧(简单的应该想想就会了) 嗯,这个题看起来像个搜索呢(就是个搜索) 我们仔细想想就知道这个题肯定不能用深搜,可以优化的地方太少了,TLE是必然的. 那我们该怎么办呢? ...
- P1032 字串变换 字符串BFS
题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1 ->B_1B1 A_2A2 -> B_2B2 规则的含义为:在 AA中的子串 A_1A1 ...
随机推荐
- spring加载多个配置文件如何配置
为应用指定多个配置文件: 多个配置文件的关系: 并列 包含 并列关系 即有多个配置文件,需要同时加载这多个配置文件: 可以使用可变参数,数组和统配符进行加载: 可变参数 String config1 ...
- 【转载】C#中int.TryParse方法和int.Parse方法的异同之处
在C#编程过程中,int.TryParse方法和int.Parse方法都可以将字符串string转换为整型int类型,但两者还是有区别,最重要的区别在于int.TryParse方法在字符串无法转换为i ...
- JavaWeb 之 三层架构:软件设计架构
界面层(表示层):用户看的得界面.用户可以通过界面上的组件和服务器进行交互. 业务逻辑层:处理业务逻辑的. 数据访问层:操作数据存储文件.
- pip笔记(译)
从PyPI中安装包 >>> pip install SomePackage [...] Successfully installed SomePackage 从PyPI或其他地方安装 ...
- nginx服务的基本配置
Nginx在运行时,至少必须加载几个核心模块和一个事件类模块.这些模块运行时所支持的配置项称为基本配置.由于配置项较多,所以把它们按照用户使用时的预期功能分为四类: 用于调试.定位问题的配置项 正常运 ...
- 【书评:Oracle查询优化改写】第三章
[书评:Oracle查询优化改写]第三章 BLOG文档结构图 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 隐含参数 ...
- JS正则表达式提取数字
/** * [参数str] * @type {var String} * return 30 */ var str = "ren民BI30kuai" console.log(str ...
- hash表的理解
哈希表 先从数组说起 任何一个程序员,基本上对数组都不会陌生,这个最常用的数据结构,说到它的优点,最明显的就是两点: 简单易用,数组的简易操作甚至让大多数程序员依赖上了它,在资源富足的情况下,我们甚至 ...
- idea 使用在java 包下的ftl、xml 文件编译问题
问题 使用ftl 时报错出现ftl 文件找不到,后发现idea未编译java 下的ftl文件 解决方法一 手动编译,复制ftl的文件夹在classes下应该在的地方 解决方法二 pom.xml中加入 ...
- 学.Net Core Web Api开发 ---- 系列文章
循序渐进学.Net Core Web Api开发系列[1]:开发环境 循序渐进学.Net Core Web Api开发系列[2]:利用Swagger调试WebApi 循序渐进学.Net Core We ...