洛谷题目链接:字串变换

题目描述

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

A1 -> B1

A2 -> B2

规则的含义为:在 A$中的子串 A1 可以变换为 B1、A2 可以变换为 B2 …。

例如:A='abcd'B='xyz'

变换规则为:

‘abc’->‘xu’‘ud’->‘y’‘y’->‘yz’

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

‘abcd’->‘xud’->‘xy’->‘xyz’

共进行了三次变换,使得 A 变换为B。

输入输出格式

输入格式:

输入格式如下:

A B A1 B1 \

A2 B2 |-> 变换规则

... ... /

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

输出格式:

输出至屏幕。格式如下:

若在 10 步(包含 10步)以内能将 A 变换为 B ,则输出最少的变换步数;否则输出"NO ANSWER!"

输入输出样例

输入样例#1:

abcd xyz

abc xu

ud y

y yz

输出样例#1:

3

简述一下题意: 给出一个起始串,一个目标串,以及一堆变换方法.要求出能否在10步以内将起始串转换为目标串.




显然是直接广搜或者深搜.主要麻烦的就是处理这个字符串的变换.

为了方便起见,这里使用了STL自带的string类型.这里借鉴 copy 了一下洛谷的题解,学习了一下string类函数的用法.




下面主要讲一下string类函数吧.

  • 定义一个string类型

  • 对一个string类型进行赋值(下标以0为起点).

  • 在一个string类型后加入一段字符.

  • length()返回一个string类型的长度.

  • begin()/end()返回一个迭代器,指向字符串的第一个/最后一个元素.

  • find()查找一个string类型内第一次出现某个字符串的下标.

  • erase()删除一个string类型中的一个子串(两个参数为下标和删除长度).

  • substr()查找一个string类型的字串.

    string s;
    s = "this_is_string";//对string类型赋值
    int len = s.length();//返回string类型的长度
    printf("len=%d\n",len);
    s += "_haha";//在string类型最后加上一个字符串
    string::iterator it;
    string::iterator start = s.begin();
    string::iterator end = s.end();//定义一个string类型的迭代器
    for(it = start;it != end;it++)
    printf("%c",*it);
    printf("\n");
    int pos = s.find("is");//查找string类型中一个字符串第一个字母第一次出现的位置
    cout << pos << endl;
    s.erase(s.find("_"),3);
    //s.erase(start+8,end-5);//同样也是删除
    cout << s.substr() << endl;//默认直接输出整个string
    cout << s.substr(5) << endl;//从第5位截取到最后
    cout << s.substr(5,6) << endl;//从第12位开始截取4的长度的字串

其实我觉得这道题并不是很难,但是这个转换字符的操作比较麻烦,所以主要就是写好这个转换字符的函数就好了.

#include<bits/stdc++.h>
using namespace std; int cnt = 0;
string st, ed;
string c1[10], c2[10]; int step[100000];
string q[100000];
map <string,bool> vis; string change(string s,int i,int j){
string ans = "";
if (i+c1[j].length() > s.length())
return ans;
for (int k=0; k < c1[j].length();k++)
if (s[i+k] != c1[j][k])
return ans;
ans = s.substr(0,i);
ans += c2[j];
ans += s.substr(i+c1[j].length());
return ans;
} void bfs(){
int head = 1, tail = 1, len, x , flag = 0;
string now, nx;
q[tail] = st; vis[st] = 1;
while(head <= tail){
x = head; head++;
now = q[x]; len = now.length();
if(now == ed){flag = 1; break;}
for(int i=0;i<len;i++)
for(int j=1;j<=cnt;j++){//枚举每一位进行修改
nx = change(now,i,j);
if(vis[nx]) continue;
q[++tail] = nx; step[tail] = step[x]+1;
vis[nx] = 1;
}
}
if(flag && step[x] <= 10) printf("%d\n",step[x]);
else printf("NO ANSWER!\n");
} int main(){
//freopen("data.in","r",stdin);
cin >> st >> ed;
while(cin >> c1[++cnt]) cin >> c2[cnt];
cnt--;
bfs();
return 0;
}

[洛谷P1032] 字串变换的更多相关文章

  1. 洛谷 P1032 字串变换题解

    题目链接:https://www.luogu.org/problem/P1032 题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1​ ->B_1B1​ A ...

  2. 洛谷 P1032 字串变换

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

  3. 洛谷 P1032 字串变换 (BFS)

    题目传送门 我即使是死了,钉在棺材里了,也要在墓里,用这腐朽的声带喊出 STL大法好 这题最麻烦的其实是处理字符串,真正的搜索部分我个人认为也就只有橙题或黄题的难度.而处理字符串,正如前面所说,STL ...

  4. 洛谷 P1032 字串变换 题解

    每日一题 day19 打卡 Analysis 广搜+map判重 用find寻找字串,再用replace替换字串 这里的map相当于正常广搜的一个book的作用 #include<iostream ...

  5. 洛谷P1032 字串变换【bfs】

    题目链接:https://www.luogu.org/problemnew/show/P1032 题意: 给定一个原字符串和目标字符串,以及几个字符串变换的规则. 问能否根据这几个规则在十步之内把原字 ...

  6. 洛谷P1032 字串变换-题解

    https://www.luogu.org/problemnew/show/P1032--(题目传送) 好在数据范围很小,暴力一点也能过.思路较简单,按照所有规则,从第一位开始广搜. 注意:1.str ...

  7. 洛谷 P1032 字串变换(map)

    题目传送门 解题思路: 搜索题,因为要求最少次数,用bfs. AC代码: #include<cstdio> #include<iostream> #include<cst ...

  8. 集训作业 洛谷P1032 字串变换

    集训的题目有点多,先写困难的绿题吧(简单的应该想想就会了) 嗯,这个题看起来像个搜索呢(就是个搜索) 我们仔细想想就知道这个题肯定不能用深搜,可以优化的地方太少了,TLE是必然的. 那我们该怎么办呢? ...

  9. P1032 字串变换 字符串BFS

    题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1​ ->B_1B1​ A_2A2​ -> B_2B2​ 规则的含义为:在 AA中的子串 A_1A1​ ...

随机推荐

  1. 25、react入门教程

    0. React介绍 0.1 什么是React? React(有时称为React.js 或ReactJS)是一个为数据提供渲染HTML视图的开源JavaScript库. 它由FaceBook.Inst ...

  2. fidder工具学习抓取Firefox包

    fidder抓取Firefox的https请求 抓包之前需要设置fidder,我下面的截图是fidder4,打开fidder—>Tools—>Options如图: 选择https,勾选所有 ...

  3. IDE API SDK JDK

    一.IDE 英文全称:Integrated Development Environment 中文名称:集成开发环境 本质:应用程序 功能:提供程序开发环境 组成:代码编辑器.编译器.调试器.图形用户界 ...

  4. Linux 进程,线程,线程池

    在linux内核,线程与进程的区别很小,或者说内核并没有真正所谓单独的线程的概念,进程的创建函数是fork,而线程的创建是通过clone实现的. 而clone与fork都是调用do_fork(),差异 ...

  5. cmd端口占用查看和关闭端口

    cmd——回车,输入netstat -ano——回车,可以查看已占用的端口,记下端口的PID,然后打开任务管理器,点查看,选择列,勾选PID确定,找到对应的PID,结束进程,如果结束不了或者结束后还不 ...

  6. [Elasticsearch] 多字段搜索 (一) - 多个及单个查询字符串

    多字段搜索(Multifield Search) 本文翻译自官方指南的Multifield Search一章. 查询很少是只拥有一个match查询子句的查询.我们经常需要对一个或者多个字段使用相同或者 ...

  7. Aspose.Pdf合并图片到PDF文件

    将图片和PDF文件合成为新的PDF文件,可以先将图片转换为PDF文件, 然后合成PDF即可, 将图片转换成PDF文件有如下方法: Aspose.Pdf.Document Aspose.Pdf.Gene ...

  8. oracle约束条件

    约束条件有5种 非空约束(not null):约束该列一定要输入值 主关键字约束(primary key):用来唯一标示表中的一个列,一个表中的主键约束只能有一个 外关键字约束(foreign key ...

  9. 【bzoj4052】[Cerc2013]Magical GCD 暴力

    题目描述 给出一个长度在 100 000 以内的正整数序列,大小不超过 10^12.  求一个连续子序列,使得在所有的连续子序列中,它们的GCD值乘以它们的长度最大. 样例输入 1 5 30 60 2 ...

  10. 【转】如何解决每次打开office2010都会出现正在配置以及使用KMS

    转自:http://jingyan.baidu.com/article/90895e0fb1525964ec6b0bb5.html 一.使用mini-KMS_Activator_v1.2_Office ...