集训作业 洛谷P1032 字串变换
集训的题目有点多,先写困难的绿题吧(简单的应该想想就会了)
嗯,这个题看起来像个搜索呢(就是个搜索)
我们仔细想想就知道这个题肯定不能用深搜,可以优化的地方太少了,TLE是必然的。
那我们该怎么办呢?
很简单,用选代加深啊,我真是个睿(弱)智的小孩。
一遍自认为很强大的选代加深后:

嗯,放弃了。
明显以我的能力驾驭不了选代加深,优化不够……
我只能用优化力度更大的广搜了。
什么?为啥早不用?我说了,我是个睿(弱)智的小孩。
广搜可以用的优化更多了,有一个神奇的东西叫做记忆化,广搜有个特点,如果这个点之前曾经查询到过,那这次用的步数就一定比上次少。我们定义一个数组表示来过没有,曾经来过就可以停下了。如果你不知道“这次用的步数就一定比上次少”是为什么的话就戳这里。
好了,该用什么搜索已经定了,该解决一下第二恶心的东西了。
字符串,一个新手的噩梦(我看见了都恶心)
但这个题竟然让我们匹配字符串(对于我这种渣渣简直毫无人性),没办法,只能硬上了。
我们来愉快的模拟吧。具体代码后面一起贴出来吧。
代码出现了:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
using namespace std;
string n,m,gb;
long long w,t,shu,bj,bss;
string as,jc;
queue<string>s;
queue<int>bs;
map<string,int>mp;
struct hehe
{
string a,b;
long long cd;
}sz[10];
bool pd(int x,int y,string mb,string yl)//这就是我们的判断环节,x和y是开始和结束节点,y是故意大了一个的。
{
//mb是目标,就是看看原来的字符串x到y-1位是不是和条件对应(理解成脏话的同学要考虑一下自己的品德哦),yl当然就是原来的意思啦。
jc="";
for(int i=x;i<y;i++)
{
jc+=yl[i];//把要对比的一段取出来
}
if(jc==mb)//是一样的,可以替换。
{
return true;
}
}
void pj(int x,int y,string mb,string yl)//刚才替换成功了,现在要来看看替换完之后的字符串是什么。
{
jc="";//又是jc,我也忘了为啥叫jc了,可能因为他不重要
for(int i=0;i<x;i++)
{
jc+=yl[i];//替换的前面
}
jc+=mb;//替换的部分
for(int i=y;i<yl.length();i++)
{
jc+=yl[i];//替换的后面
}
//成品jc出炉
return;
}
void bfs()//喜闻乐见的广搜环节
{
while(s.empty()!=true)//还有路,不要放弃
{
as=s.front();//来看看这次在哪里
bss=bs.front();//走到这里用了多少步
if(as==m)//哎呀到地方了。
{
bj=1;
cout<<bss<<endl;//嗯,我一共走了bss步。
return;
}
for(int i=0;i<shu;i++)//额,又没走到,看看下一步有什么情况可以走。
{
for(int j=0;j+sz[i].cd-1<as.length();j++)//如果接下来的数量不够我换,那就不走了。
{
if(pd(j,j+sz[i].cd,sz[i].a,as)==true&&bss!=10)//我是可以换的,而且移动次数也没到10步。换吧
{
pj(j,j+sz[i].cd,sz[i].b,as);//来获取一下我该变成什么样子的
if(mp[jc]==0)//他没出现过哎,这是第一次来,存进去
{
mp[jc]=1;//现在他出现了
s.push(jc);
bs.push(bss+1);//走到变成现在前一步用了bss步,再走一步,自然就是bss+1啦。
}
}
}
}
s.pop();//别忘了删除掉哦,这可是一次性用品
bs.pop();
}
}
int main()
{
cin>>n>>m;
mp[n]=1;//这个是map,也就是记忆化数组。
s.push(n);//储存所有下一步可移动地点的队列s
bs.push(0);//储存对应操作步数的队列bs
while(cin>>sz[shu].a>>sz[shu].b)//一个神奇的方法,输入Ctrl+Z就可以停止了(这是一个大佬教我的,他叫FUXyao)
{
sz[shu].cd=sz[shu].a.length();//一会准备匹配用的长度
shu++;
}
bfs();
if(bj==0)//不可能到达目标。
{
cout<<"NO ANSWER!"<<endl;
}
return 0;
}
代码一如既往的臭长,希望同学们谅解。
如果有不明白的地方,可以评论在下面,我会更改的。
集训作业 洛谷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 字串变换 字符串BFS
题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1 ->B_1B1 A_2A2 -> B_2B2 规则的含义为:在 AA中的子串 A_1A1 ...
随机推荐
- cc21a -c++重载成员操作符*,->,代码示范
cc21a重载成员操作符*,->, *,解引用操作符 ->箭头操作符,用于智能指针类 #include "pointer.h" //pointer.cpp #inclu ...
- JAVA设计模式 1 设计模式介绍、单例模式的理解与使用
数据结构我们已经学了一部分了.是该了解了解设计模式了.习惯了CRUD的你,也该了解了解这一门神器.我为啥要说是神器呢? 因为在大厂的面试环节.以及很多的比如 Springboot Mybatis 等开 ...
- Python多核编程mpi4py实践及并行计算-环境搭建篇
1.安装python,这个没什好说的,直接装就行 2.做并行计算.数据挖掘,机器学习等一般都要用的numpy,这个在Windows版本上安装有点问题,安装比较麻烦,建议在linux上搭建环境 3.安装 ...
- Blazor带我重玩前端(一)
写在前面 曾经我和前端朋友聊天的时候,我说我希望有一天可以用C#写前端,不过当时更多的是美好的想象,而现在这一切正变得真实…… 什么是Blazor 我们知道浏览器可以正确解释并执行JavaScript ...
- 二叉查找树、平衡二叉树(AVLTree)、平衡多路查找树(B-Tree),B+树
B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引. B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的. 在 ...
- JavaWeb网上图书商城完整项目--day02-20.修改密码各层实现
1.我们来看看后台操作的业务流程 每一层都按照上面的步骤来进行实现: 这里我们要使用commUtils.toBean把表单提交的参数封装成User对象,必须保证User对象中的字段和表单提交的字段的名 ...
- shell编程之系统环境变量
点后面加上空格+配置文件等价于source 配置文件 常见的系统环境变量的配置 Bash_profile和.bashrc存在在家目录下,~表示家目录 [root@localhost home]# cd ...
- Visual C++线程同步技术剖析:临界区,时间,信号量,互斥量
使线程同步 在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作.更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解.正常情况下对这种处理结果的了解应当在其 ...
- Nginx之upstream的四种配置方式
1.轮询(weight) 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况.默认当weight不指定时,各服务器weight相同,每个请求按时间顺序逐一分配到不同的后端服务 ...
- 关于 charset 的几种编码方式
经常遇到charset=gb2312.charset=iso-8859-1.charset=utf-8这几种编码方式,它们有什么不同,看下面的图 编码方式 含义 charset=iso-8859-1 ...