NOIP 2002 提高组 字串变换
题目描述
已知有两个字串 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!"
输入输出样例
abcd xyz
abc xu
ud y
y yz
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 提高组 字串变换的更多相关文章
- NOIP 2002提高组 选数 dfs/暴力
1008 选数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知 n 个整数 x1,x2,…, ...
- 1099 字串变换 2002年NOIP全国联赛提高组
1099 字串变换 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 已知有 ...
- 字串变换 (2002 年NOIP全国联赛提高组)
一道看似非常水的题 大意 :将一个字串 经过几种变换规则变为给定的另一个子串 ,求最小操作数. code[vs] 传送门 洛谷传送门 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): ...
- [COGS 0065][NOIP 2002] 字串变换
65. [NOIP2002] 字串变换 ★★ 输入文件:string.in 输出文件:string.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 已知有两个字 ...
- [NOIP2002] 提高组P1032 字串变换
题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...
- 「NOIP2002」「Codevs1099」 字串变换(BFS
1099 字串变换 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知有两个字串 $A$, ...
- Codevs 1099 字串变换
1099 字串变换 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 已知有 ...
- 【洛谷1032 】【CJOJ1711】【NOIP2002】字串变换
###题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换 ...
- 双向BFS—>NOIP2002 字串变换
如果目标也已知的话,用双向BFS能很大提高速度 单向时,是 b^len的扩展. 双向的话,2*b^(len/2) 快了很多,特别是分支因子b较大时 至于实现上,网上有些做法是用两个队列,交替节点搜索 ...
随机推荐
- 2.vue 安装教程
安装node.js 从node.js官网下载并安装node,安装过程很简单,一路"下一步"就可以了(傻瓜式安装). 安装完成之后,打开命令行工具,输入 node -v,如下图,如果 ...
- 4.jsp的内置对象
1.jsp有九大内置对象 out request response session application page pagecontext exception config 2.用户发请求 requ ...
- 本地jar上传到本地仓库
转自:http://www.blogjava.net/fancydeepin/archive/2012/06/12/380605.html thanks!! Maven 确确实实是个好东西,用来管 ...
- C# 校验帮助类-正则表达式
一.简介 很多时候我们都需要用到一些验证的方法,有时候需要用正则表达式校验数据时,往往需要到网上找很久,结果找到的还不是很符合自己想要的.所以我把自己整理的校验帮助类分享处理,在这里分享一下,给自己留 ...
- Web开发资料
慢慢更新 1. Quackit 墙裂推荐!提供了一系列教程,bootstrap的模板也很好用. 2. Bootstrap 4 Cheat Sheet 好用,比官网更加一目了染.  3.Chart. ...
- [图形学] 习题8.12 NLN二维线段裁剪算法实现
Nicholl-Lee-Nicholl二维线段裁剪算法相对于Cohen-Sutherland和Liang-Barsky算法来说,在求交点之前进行了线段端点相对于几个区域的判断,可以确切的知道要求交点的 ...
- wifi扩展设置
一.主路由器设置 网络参数 LAN口设置查到 MAC地址,用于设置扩展路由器 Bridge功能设置时 AP1的地址 2.无线基本设置,桥的 SSID BSSID 为扩展 3.无线安全设置 二.扩展路由 ...
- HttpClient以json形式的参数调用http接口并对返回的json数据进行处理(可以带文件)
1.参数的url就是被调用的地址,map是你要传的参数.参数转成json我使用的是gson方式转换的. 主要使用的jar包有httpclient-4.5.3.jar.httpcore-4.4.6.ja ...
- Mifare l卡特性简介
电气特性 l 容量为8K位EEPrOM l 分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位 l 每个扇区有独立的一组密码及访问控制 l ...
- JS事件响应的学习总结
点击事件:ocnlick 鼠标经过事件:onmouseover 鼠标移开事件:onmouseout 获得焦点事件:onfocus 失去焦点事件:onblur 内容选中事件:onselect 文本框内容 ...