洛谷题目链接:字串变换

题目描述

已知有两个字串 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. spring、spring-data-redis整合使用

    一.Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 从2010年3月15日起,Redis的开发工作由VMwa ...

  2. js学习日记-常用正则符号参考

    预定义类 量词 贪婪.惰性.支配性量词 前瞻 边界 RegExp是全局对象,RegExp.$1...$9是全局属性.当执行任意正则表达式匹配操作时,JavaScript会自动更新全局对象RegExp上 ...

  3. BZOJ 1968 [Ahoi2005]COMMON 约数研究:数学【思维题】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1968 题意: 设f(x) = x约数的个数.如:12的约数有1,2,3,4,6,12,所以 ...

  4. 利用selenium自动化登录淘宝

    #encoding=utf-8 from selenium import webdriver from selenium.webdriver.common.action_chains import A ...

  5. 第三十五篇 类的内置属性(attr属性),包装和授权,__getattr__

    双下划线开头的attr方法,都是类内置的方法. 一. 如果没有在类里定义这三个方法,调用的时候就调用类内置的默认的方法 class Too: pass # 类没有定义这三个属性,就用系统默认的方法 t ...

  6. python学习总结----异常处理

    相关概念 - 错误:程序运行之前的语法错误,如:关键字.缩进不齐.括号不成对. - 异常:在程序运行过程中出现的问题,如:除数为0.对象属性不存在等. 异常处理 - 说明:异常处理可以理解为特殊的流程 ...

  7. LeetCode - 3. Longest Substring Without Repeating Characters(388ms)

    Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...

  8. python基础训练营01

    一.基础讲解: 1.1 文件末尾的.py后缀,指出这个文件,是一个python文件,因此,系统将使用python解释器来运行该文件,确定文件中每一个单词的含义. 1.2 python编辑/运行方法: ...

  9. 常见 SQL语句使用 增删改查

    一.常见的增删改查(一).查:1.SELECT 列名称 FROM 表名称,其中列名可以是多个,中间用豆号分开,如SELECT LastName,FirstName FROM Persons: 2.SE ...

  10. nopcommerce商城系统--安装nopCommerce

    原址:http://www.nopcommerce.com/docs/79/installing-nopcommerce.aspx .NET Framework 4.5.1下载:http://www. ...