【洛谷】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中AspectJ的使用
目录 AspectJ: AOP术语 通知的类型 切入点表达式 基于xml的AspectJ编程 导入jar包 定义切面类 引入约束 AOP配置 基于注解的AspectJ编程 AspectJ: 什么是AO ...
- 2019 搜狐java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.搜狐等公司offer,岗位是Java后端开发,因为发展原因最终选择去了搜狐,入职一年时间了,也成为了面试官,之 ...
- Spring框架的核心概念是什么?需要掌握的知识点都有哪些?
Spring其主要精髓 就是IOC和AOP.掌握好了这两点对于理解Spring的思想颇有意义. IOC(英文 Inversion of Control)就是控制反转的意思.就是把新建对象(new Ob ...
- Linux内核同步机制之completion
内核编程中常见的一种模式是,在当前线程之外初始化某个活动,然后等待该活动的结束.这个活动可能是,创建一个新的内核线程或者新的用户空间进程.对一个已有进程的某个请求,或者某种类型的硬件动作,等等.在这种 ...
- httpclient工具类,post请求发送json字符串参数,中文乱码处理
在使用httpclient发送post请求的时候,接收端中文乱码问题解决. 正文: 我们都知道,一般情况下使用post请求是不会出现中文乱码的.可是在使用httpclient发送post请求报文含中文 ...
- 解决window tomcat 8.5 启动控制台输出为乱码
解决办法 1.打开你安装Tomcat的所在目录. 2. 打开后选择conf目录. . 3. 将里面的logging.properties文件用编辑器打开,本例子是使用“Notepad++”编辑器打开. ...
- MySQL修炼之路五
1. 存储引擎和锁 1. 存储引擎(处理表的处理器) 1. 基本操作 1. 查看所有存储引擎 mysql>show engines; 2. 查看已有表的存储引擎 mysql>show cr ...
- JS使用Cookie
包:https://www.npmjs.com/package/js-cookie 一.安装 npm install js-cookie --save 二.引用 import Cookies from ...
- Thinkphp 配置不用输入index.php
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/u011186019/article/det ...
- CentOS7.5安装SVN和可视化管理工具iF.SVNAdmin
一.安装Apache和PHP 由于iF.SVNAdmin使用php写的,因此我们需要安装php yum install httpd php 二.安装SVN服务器(其中,mod_dav_svn是Apac ...