zoukankan      html  css  js  c++  java
  • P1032 字串变换

    大致题意:

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

    基本思路

    • 恶毒字串加广搜,如(哔~)一般真恶心!
    • 能A这道题真不容易,真·WA了无数次啊啊啊。
    • 康康这惨不忍睹的评测记录:
    • QQ截图20200514133018.png
    • 这**都是血泪史啊啊啊。
    • 好了先说一下这坑人的迭代加深,可能是没有练到家,一直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;//因为一开始初始话为1,所以现在要减去1
        bfs();
        if(flag){//若没有标记则说明没有答案输出,就输出"NO ANSWER!"
            printf("NO ANSWER!");
        }
        return 0;
    }
    
  • 相关阅读:
    C#中Dictionary的用法
    System.Timers.Timer用法
    C#中的异步调用及异步设计模式(三)——基于事件的异步模式
    C#中的异步调用及异步设计模式(二)——基于 IAsyncResult 的异步设计模式
    C#中的异步调用及异步设计模式(一)
    [你必须知道的异步编程]——异步编程模型(APM)
    strncasecmp与strcasecmp用法
    C语言之strrchr函数
    HDU 5289 Assignment (ST算法区间最值+二分)
    poj 1733 Parity game(种类并查集)
  • 原文地址:https://www.cnblogs.com/FUXyao/p/12888448.html
Copyright © 2011-2022 走看看