码迷,mamicode.com
首页 > 其他好文 > 详细

P1032 字串变换

时间:2020-05-14 15:05:15      阅读:50      评论:0      收藏:0      [点我收藏+]

标签:没有   count   void   通过   lol   lag   main   string   tps   

大致题意:

  • 通过一系列的规则将A变为B,
  • 在十步以内能变成B的话就输出步数,
  • 若超过十步则输出NO ANSWER!

基本思路

  • 恶毒字串加广搜,如(哔~)一般真恶心!
  • 能A这道题真不容易,真·WA了无数次啊啊啊。
  • 康康这惨不忍睹的评测记录:
  • 技术图片
  • 这**都是血泪史啊啊啊。
  • 好了先说一下这坑人的迭代加深,可能是没有练到家,一直80分,嗯..不用了,
  • 然后..广搜好,广搜妙,广搜呱呱叫!!!
  • 最后直接拿广搜硬怼上去就好了。

Code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
using namespace std;
#define R read()
#define GC getchar()
#define ll long long
#define ull unsigned long long
#define INF 0x7fffffff
#define LLINF 0x7fffffffffffffff
ll read(){
    ll s=0,f=1;
    char c=GC;
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-f;c=GC;}
    while(c>=‘0‘&&c<=‘9‘){s=s*10+c-‘0‘;c=GC;}
    return s*f;
}
string a,b;
string x[10],y[10];
int tot=1;
queue<string> q;
queue<int> step;
map<string,int> mp;
int flag=1;
void bfs(){
    q.push(a);
    step.push(0);//进队列
    mp[a]=1;//标记这个字符串搜过
    while(!q.empty()){
        string s=q.front();
        int st=step.front();//记录
        if(st>10){//如果步数超过了10步,那么直接滚粗就好了
            return ;
        }
        if(s==b){//如果相等了就说明已经有答案了,输出标记一下
            printf("%d",st);
            flag=0;
            return ;
        }
        for(int i=1;i<=tot;++i){
            int up=0;//为了配合find的使用,意思是从第up位开始搜有没有x[i]
            while(s.find(x[i],up)!=s.npos){//while是因为防止有多个字符串x[i]的数据出现
                string str=s;
                int id=s.find(x[i],up);
                str.replace(id,x[i].length(),y[i]);//替换
                if(!mp.count(str)){//如果没有搜到过
                    q.push(str);
                    step.push(st+1);//入队列
                    mp[str]=1;//标记
                }
                up=id+1;//为下一次搜索x[i]做准备
            }
        }
        q.pop();
        step.pop();//出队列
    }
}
int main(){
    cin>>a>>b;
    while(cin>>x[tot]>>y[tot]){
        ++tot;
    }//输入
    --tot;
    bfs();
    if(flag){//若没有标记则说明没有答案输出,就输出"NO ANSWER!"
        printf("NO ANSWER!");
    }
    return 0;
}

P1032 字串变换

标签:没有   count   void   通过   lol   lag   main   string   tps   

原文地址:https://www.cnblogs.com/FUXyao/p/12888448.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!