题目描述

已知有两个字串 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

表示做题时感到了NOIP深深的恶意……

这道题并不容易用比较快的数据结构实现,比如我的字符数组强迫症和模拟队列强迫症就被压得很惨,直接被教做人

好在数据并不大,最多求十步,反复提交发现只有不到十种变换方式,所以还是可以用string和STL que的,如果数据大,强迫症真得被搞死

所以如果可以用string和STL que的话,这题还比较好解

主要思想是如果当前能够变换就进行变换,然后把变换过的放入队尾,什么时候对头是变换完成的就直接输出步数

但是会超时,所以需要剪枝,可能有的串先变换与后变换变出的串相同,所以一个串只需记录第一次出现的情况,后来的步数肯定比第一次的步数多,所以不要,可以用一个map实现,存储<string,bool>如果串出现了,就将bool变为1,蛮巧妙地就将重复的情况解决了

而替换字符串是重点,这就是为什么不用字符数组,因为字符串有函数,实在是好使,大杀器一样,这个函数叫做 .replace(a,len,b),有三个参数,大概用法就是将字符串a后的len位替换为字符串b,与字符串b的大小无关,就是说b多长都能塞到len大小的空当里

上代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
using namespace std;
int way=;
string start,end,a[],b[];
struct data{
string s;
int step;
}aa;
queue<data> que;//队列记录当前情况字符串以及步数
map<string,bool> m;
int main(){
cin>>start>>end;
while(cin>>a[way]>>b[way])
way++;
way--;//变换种类
aa.s=start;
aa.step=;
que.push(aa);
m[start]=;
while(!que.empty()){
data temp=que.front();
que.pop();
if(temp.step>){
printf("NO ANSWER!");//超步输出然后直接break
return ;
}
if(temp.s==end){
printf("%d",temp.step);//如果是最终情况就输出当前步数
return ;
}
string t=temp.s;
int len=t.length();
string next;
for(int i=;i<=way;i++){//将每一种变换方式都尝试并入队
int llen=a[i].length();
for(int j=;j<len;j++){
if(t.substr(j,llen)==a[i]){
next=t;
next.replace(j,llen,b[i]);
if(!m[next]){//看看是否出现过
m[next]=;
data tt;
tt.step=temp.step+;
tt.s=next;
que.push(tt);//如果都能满足就入队
}
}
}
}
}
return ;
}

NOIP 2002 提高组 字串变换的更多相关文章

  1. NOIP 2002提高组 选数 dfs/暴力

    1008 选数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知 n 个整数 x1,x2,…, ...

  2. 1099 字串变换 2002年NOIP全国联赛提高组

    1099 字串变换 2002年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 已知有 ...

  3. 字串变换 (2002 年NOIP全国联赛提高组)

    一道看似非常水的题 大意 :将一个字串 经过几种变换规则变为给定的另一个子串 ,求最小操作数. code[vs] 传送门 洛谷传送门 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): ...

  4. [COGS 0065][NOIP 2002] 字串变换

    65. [NOIP2002] 字串变换 ★★   输入文件:string.in   输出文件:string.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 已知有两个字 ...

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

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

  6. 「NOIP2002」「Codevs1099」 字串变换(BFS

    1099 字串变换 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold   题目描述 Description 已知有两个字串 $A$, ...

  7. Codevs 1099 字串变换

    1099 字串变换 2002年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 已知有 ...

  8. 【洛谷1032 】【CJOJ1711】【NOIP2002】字串变换

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

  9. 双向BFS—>NOIP2002 字串变换

    如果目标也已知的话,用双向BFS能很大提高速度 单向时,是 b^len的扩展. 双向的话,2*b^(len/2)  快了很多,特别是分支因子b较大时 至于实现上,网上有些做法是用两个队列,交替节点搜索 ...

随机推荐

  1. 2.vue 安装教程

    安装node.js 从node.js官网下载并安装node,安装过程很简单,一路"下一步"就可以了(傻瓜式安装). 安装完成之后,打开命令行工具,输入 node -v,如下图,如果 ...

  2. 4.jsp的内置对象

    1.jsp有九大内置对象 out request response session application page pagecontext exception config 2.用户发请求 requ ...

  3. 本地jar上传到本地仓库

    转自:http://www.blogjava.net/fancydeepin/archive/2012/06/12/380605.html   thanks!! Maven 确确实实是个好东西,用来管 ...

  4. C# 校验帮助类-正则表达式

    一.简介 很多时候我们都需要用到一些验证的方法,有时候需要用正则表达式校验数据时,往往需要到网上找很久,结果找到的还不是很符合自己想要的.所以我把自己整理的校验帮助类分享处理,在这里分享一下,给自己留 ...

  5. Web开发资料

    慢慢更新 1. Quackit 墙裂推荐!提供了一系列教程,bootstrap的模板也很好用. 2. Bootstrap 4 Cheat Sheet 好用,比官网更加一目了染.  3.Chart. ...

  6. [图形学] 习题8.12 NLN二维线段裁剪算法实现

    Nicholl-Lee-Nicholl二维线段裁剪算法相对于Cohen-Sutherland和Liang-Barsky算法来说,在求交点之前进行了线段端点相对于几个区域的判断,可以确切的知道要求交点的 ...

  7. wifi扩展设置

    一.主路由器设置 网络参数 LAN口设置查到 MAC地址,用于设置扩展路由器 Bridge功能设置时 AP1的地址 2.无线基本设置,桥的 SSID BSSID 为扩展 3.无线安全设置 二.扩展路由 ...

  8. HttpClient以json形式的参数调用http接口并对返回的json数据进行处理(可以带文件)

    1.参数的url就是被调用的地址,map是你要传的参数.参数转成json我使用的是gson方式转换的. 主要使用的jar包有httpclient-4.5.3.jar.httpcore-4.4.6.ja ...

  9. Mifare l卡特性简介

    电气特性 l         容量为8K位EEPrOM l         分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位 l         每个扇区有独立的一组密码及访问控制 l  ...

  10. JS事件响应的学习总结

    点击事件:ocnlick 鼠标经过事件:onmouseover 鼠标移开事件:onmouseout 获得焦点事件:onfocus 失去焦点事件:onblur 内容选中事件:onselect 文本框内容 ...