codevs1099 字串变换 string黑科技+队列

题目链接 : 戳我

好歹也是2002年NOIP全国联赛提高组,开始不知道string黑科技,打起来恶心的要死……后来知道了黑科技,打起来真是快,T起来也真是快,不过对于当年数据还是可以的。

题目一看,好难,再看数据范围,暴力能过,于是就想打暴力吧,但是由于字符串比较恶心,自己对字符串处理不太擅长,于是就打了一半放弃治疗,看了题解(我当时打了70行题解39行)……

暴力思想就是:对于一个串,暴力枚举字符串的每一位,对于每一位枚举字符串,看看是否可以匹配,如果可以匹配,那就把这个状态加入队列,now.step = f.step + 1,如果到达目标状态就输出,如果大于10步,输出NO ANSWER!.

string黑科技在代码中有讲…………黑科技部分2333;

#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 ++)
            /*
                string类型黑科技: 
                compare(从该位置开始,比较的长度,要比较的s)
                replace(从该位置开始,替换中原串长度,替换串s)
            */
                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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值