洛谷题目链接:字串变换

题目描述

已知有两个字串 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. ajax同步和异步的切换

    ajax为网页提供了非常不错的异步机制,但是有时候两个ajax放在一起,希望第一个完成后再继续第二个ajax的执行.这时候可以将第一个ajax代码带上同步参数即可,如下: $.ajax({ async ...

  2. Java常考面试题

    Java常考面试题 1. 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? 答:Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行 ...

  3. Excel拼接字符串

             有时候,需要把一些Excel表格中的内容进行拼接,比如A4行的值是前面三行值的加起来.在Excel中可以使用&来进行这种操作.如果数据非常多,就可以使用这个来进行批量操作.

  4. fastlane自动化打包ipa并发布到firim或者蒲公英

    1.打开终端,确保Xcode Command Line Tools 安装了最新版 xcode-select --install 2.安装fastlane sudo gem install -n /us ...

  5. Windows Server 2008 R2 WEB 服务器安全设置指南

    http://wenku.baidu.com/view/9b66c51449649b6649d747a2.html?from=search http://wenku.baidu.com/view/84 ...

  6. 学习materialize

    <div class="container"> <div class="row">   </div> <div cla ...

  7. 最短路径——Bellman-Ford算法

    一.相关定义 最短路径:求源点到某特定点的最短距离 特点:Bellman-Ford算法主要是针对有负权值的图,来判断该图中是否有负权回路或者存在最短路径的点 局限性:算法效率不高,不如SPFA算法 时 ...

  8. 【转】H5 - HTML5新增标签

    下面分别是传统的div+css的页面布局方式 下面是HTML5布局方式: 是不是精简了很多呢  现在来说说图片中出现的标签: 结构标签:(块状元素) 有意义的div artical 标记定义一篇文章  ...

  9. 软工实践 - 第二十五次作业 Beta 冲刺(3/7)

    队名:起床一起肝活队 组长博客:https://www.cnblogs.com/dawnduck/p/10116979.html 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过 ...

  10. Python-爬取"我去图书馆"座位编码

    原文地址:http://fanjiajia.cn/2018/11/22/Python-%E7%88%AC%E5%8F%96%E2%80%9D%E6%88%91%E5%8E%BB%E5%9B%BE%E4 ...