【NOIP2002】字串变换 CODE[VS] 1039

已知有两个字串 A ,B 及一组字串变换的规则(至多6个规则):
     A1 >B1
     A2 >B2   规则的含义为:在 A$中的子串 A1 B1 、A2 B2 …。
    例如:A abcdB =’xyz’   变换规则为:
    ‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’

  则此时,A$ 可以经过一系列的

变换变为 B$,其变换的过程为:    ‘abcd’->‘xud’->‘xy’->‘xyz’

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

输入描述 Input Description 输入格式如下:

   A B    A1B1 \    A2 B2 |-> 变换规则    … … /   所有字符串长度的上限为
20。

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

样例输入 Sample Input
abcd xyz
abc xu
ud y
y yz

样例输出 Sample Output
3

数据范围及提示 Data Size & Hint hehe

string大法好QAQ STL大法好QAQ
string大法好QAQ STL大法好QAQ
string大法好QAQ STL大法好QAQ
重说三。。
首先这里我不太会处理字符串 搜索掌握的也不是很好 但是我们是c++选手呀QwQ
这里介绍一下 string库里的两个小(hei)函(ke)数(ji):
1.compare 2.replace 顾名思义 他们分别是比较和替换
定义一个字符串叫做S
S.compare(从该位置开始,比较的长度,要比较的s) 如果S 与 s 完全匹配 返回值为1 否则返回0
S.replace(从该位置开始,替换的原串长度,替换串s) 在循环中找到可以变换的部分之后进行替换

题解:
开一个结构体,并利用队列记录一下替换次数和A$串的字符 如果匹配不成功 我们就在变换规则中找到替换规则并进行replace 将新串入队 直到将两个串遍历结束 如果完全匹配且变化次数小于10 输出答案 否则输出”NO ANSWER”

代码:


/*
string类型黑科技: 
compare(从该位置开始,比较的长度,要比较的s)
replace(从该位置开始,替换中原串长度,替换串s)
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
string st,en,a[8],b[8];
struct poi{string s;int step;};
int tot = 1;
queue <poi> q;
void bfs()
{
    q.push((poi){st,0});
    while(!q.empty() && q.front().step < 10)
    {
        poi f = q.front();
        q.pop();
        for(int i = 1;i < tot;i ++)
        for(int k = 0;k < f.s.length();k ++)
        if(f.s.compare(k,a[i].size(),a[i]) == 0)    //成功匹配返回0 
        {
            string tmp = f.s;
            tmp.replace(k,a[i].size(),b[i]);    //string自带的反转 
            if(tmp == en)
            {
                cout<<f.step+1;
                return ;
            }
            q.push((poi){tmp,f.step+1});
        }
    }
    cout<<"NO ANSWER!";
}
int main()
{
    cin>>st>>en;
    while(cin>>a[tot]>>b[tot])  tot++;
    bfs();
    return 0;
}

小结:
1.STL确实好用 但string比较慢 最后一个点卡空间和时间过
2.NOIP不到四十天了 好好练码力 查缺补漏 提升实力 加油!
3.再用搜索把这个题打出来 再回来填个坑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值