题目描述

已知有两个字串A,BA,BA,B及一组字串变换的规则(至多666个规则):

A1A_1A1​ −-−> B1B_1B1​
A2A_2A2​ −-−> B2B_2B2​

规则的含义为:在 AAA中的子串 A1A_1A1​ 可以变换为 B1B_1B1​,A2A_2A2​ 可以变换为 B2B_2B2​ ⋅⋅⋅···⋅⋅⋅。

例如:A=abcd,B=xyz

变换规则为:

abcxuudyyyz

则此时,AAA可以经过一系列的变换变为BBB,其变换的过程为:

abcdxudxyxyz

共进行了333次变换,使得AAA变换为BBB。

输入格式

输入格式如下:

AAA BBB
A1A_1A1​ B1B_1B1​
A2A_2A2​ B2B_2B2​ |-> 变换规则

⋅⋅⋅···⋅⋅⋅ ⋅⋅⋅···⋅⋅⋅ /

所有字符串长度的上限为202020。

输出格式

输出至屏幕。格式如下:

若在101010步(包含101010步)以内能将AAA变换为BBB,则输出最少的变换步数;否则输出NO ANSWER!

输入输出样例

输入 #1 复制
abcd xyz
abc xu
ud y
y yz
输出 #1 复制
3

思路

首先,既然告诉了我们数据这么小,那么一定就是一个搜索,那么,是 dfsdfsdfs 好还是 bfsbfsbfs 好呢,因为我们要求的是最小的变换次数,所以 dfsdfsdfs 要把整张图搜完了才能得到最终答案,而 bfsbfsbfs 就只要第一次搜到就是最小变换次数了,所以,当然要用 bfsbfsbfs

代码

#include<bits/stdc++.h>
using namespace std;
string a[7],b[7];
int n;
map<string,int> f;//剪枝,如果这个字符串已经搜过了,就不用再搜了
struct zj{string s;//当前的字符串int k;//所用步数
};
int bfs(){queue<zj> q;q.push(zj{a[0],0});while(!q.empty()){zj x=q.front();q.pop();if(x.k==10)//没必要再搜了continue;for(int i=1;i<=n;i++){for(int pos=x.s.find(a[i],0);pos!=-1;pos=x.s.find(a[i],pos+1)){//a.find(b,x)表示在a这个字符串中从第x个字符寻找b这个字符串,如果没找到,返回-1string t=x.s;t.replace(pos,a[i].length(),b[i]);//这个a.replace(x,len,b)表示在字符串a的第x个字符后的len个字符(包括第x个字符)替换成b这个字符串if(!f[t]){//前面的剪枝if(t==b[0])//找到了解return x.k+1;f[t]=1;//标记q.push(zj{t,x.k+1});}}}}return -1;//找不到
}
int main(){while(cin>>a[n]>>b[n])n++;n--;//最后n比原来的n大1int ans=bfs();if(ans!=-1)printf("%d",ans);else printf("NO ANSWER!");return 0;
}

谢谢–zhengjun

洛谷P1032字串变换题解--zhengjun相关推荐

  1. 洛谷P1032 字串变换

    字符串的题目一般都很恶心,特别是当你妄图只用原生c语言的char去做的时候. string类虽然方便,但是相较于char慢很多.可是慢所带来的好处就是可以方便的完成很多操作.例如用string去实现这 ...

  2. P1032 字串变换(bfs)

    https://www.luogu.org/problemnew/show/P1032 题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A 1-> B 1 A 2 ...

  3. 【题解】luogu p1032 字串变换

    总结: 1.bfs的模板没有掌握好 2.string s 的时候可以用s[m]=x 将s字符串中的m位置的字符改变成x字符 一道简单的bfs #include<bits/stdc++.h> ...

  4. 洛谷1279 字串距离

    题目描述 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为"abcbcd",则字符串"abcb□cd"," ...

  5. P1032 字串变换

    题面:https://www.luogu.org/problem/P1032 本题中需熟练掌握string类型的库函数: string a,b; a.find(b,pos)为 从pos开始找b第一次出 ...

  6. 洛谷P1279 字串距离 (动态规划)

    题目描述 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为"abcbcd",则字符串"abcb□cd"," ...

  7. 广度优先搜索——字串变换(洛谷 P1032)

    题目选自洛谷P1032 题意已经把做法写得特别露骨了...最小步数,最多6个变换规则....广搜自不必说,不仅可以寻找解而且还能判断步数(根据广搜首解最优的性质可以得到). 用queue来进行广搜,需 ...

  8. 字串变换(洛谷-P1032)

    题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...

  9. P1032 [NOIP2002 提高组] 字串变换

    展开 题目背景 本题疑似错题,不保证存在靠谱的多项式复杂度的做法.测试数据非常的水,各种做法都可以通过,不代表算法正确.因此本题题目和数据仅供参考. 题目描述 已知有两个字串 A,BA,B 及一组字串 ...

最新文章

  1. “这辈子不可能打工男子”出狱了,引发热议!
  2. linux部署项目文档,Linux系统部署项目
  3. 限制IP 访问 Oracle 的方法
  4. 我为什么重新开始学习数学?
  5. 奇虎360:说爱你不容易的“母婴平台”故事
  6. SpringBoot集成JPA根据实体类自动生成表
  7. java可视化界面视频_java中的可视化界面
  8. Scrum 项目4.0--软件工程
  9. Microsoft Graph Toolkit 初探
  10. [PALAPALA] 无题 - 外来的和尚会念经
  11. mybatis typehandler
  12. opencv模糊图像变清晰_opencv-python 4.2图像模糊
  13. 深耕一个行业有缺点?
  14. SpringBoot_MD5加密工具类
  15. coldfusion_ColdFusion MX 7功能之旅
  16. java制作手机投射电脑_将Android手机投影到Win10计算机的最简单教程
  17. 100种鞋子的画法,如何画鞋子
  18. 【转载】:Autolisp:利用AuoCAD之Lisp编程案例之智能加工齿轮的演示程序-----一个处女座程序猿
  19. 通过百度地图实现定位并获取本地当日天气信息
  20. 【uni-app】H5的返回拦截经验分享

热门文章

  1. 换ip地址除开虚拟服务器,GoDaddy虚拟主机更换IP地址和更换主域名绑定的方法
  2. OSChina 周三乱弹 ——大变魔术啦,汪星人秒变熊孩子
  3. 运维小知识之CDN内容分发网络原理解析
  4. 1116: [POI2008]CLO
  5. 19.3 C++STL标准模板库大局观-容器的说明和简单应用例续
  6. 简单漏洞:CVE-2022-0543 Redis Lua 沙盒绕过
  7. 入门渗透:telnet远程登入——Meow
  8. android 回编译失败,Androidkiller 回编译失败
  9. 如何删除Chrome地址栏记录?
  10. php 根据银行卡号获取所属银行