zoukankan      html  css  js  c++  java
  • 洛谷 P1032 [ NOIP 2002 ] 字串变换 —— 字符串+bfs

    题目:https://www.luogu.org/problemnew/show/P1032

    字符串好复杂...先写了个 dfs ,RE一个点TLE一个点,不知该怎么改了...

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    char a[205],b[205],c[10][205],d[10][205];
    int n,ans=20,inf=20;
    bool ck(char x[],int l1,int i,int j)
    {
        int l2=strlen(c[j]);
        if(l1-i<l2)return 0;
        for(int t=0;t<l2&&i+t<l1;t++)
            if(x[i+t]!=c[j][t])return 0;
        return 1;
    }
    bool cmp(char x[],int l1)
    {
    //    int l1=x.length(),l2=b.length();
        int l2=strlen(b);
        if(l1!=l2)return 0;
        for(int i=0;i<l1;i++)if(x[i]!=b[i])return 0;
        return 1;
    }
    void print(char x[],int l)
    {
        printf("%d ",l);
        for(int i=0;i<l;i++)printf("%c",x[i]);
        printf("
    ");
    }
    void dfs(char x[],int s,int l)
    {
        if(cmp(x,l)){ans=min(ans,s); return;}
        if(s>=10)return;
        char nxt[205];
        for(int i=0;i<l;i++)
        {
            for(int j=1;j<n;j++)
                if(ck(x,l,i,j))
                {
                    cout<<j<<endl;
                    int l1=strlen(c[j]),l2=strlen(d[j]),ln=0;
                    for(int k=0;k<i;k++)nxt[ln++]=x[k];
                    for(int k=0;k<l2;k++)nxt[ln++]=d[j][k];
                    for(int k=i+l1;k<l;k++)nxt[ln++]=x[k];
                    dfs(nxt,s+1,ln);
                }
        }
    }
    int main()
    {
        cin>>a; cin>>b; n=1;
        while(cin>>c[n]>>d[n])n++;
    //    while(~scanf("%s",&t))
    //        c[++n]=t,scanf("%s",&d[n]);
        dfs(a,0,strlen(a));
        if(ans==inf)printf("NO ANSWER!");
        else printf("%d
    ",ans);
        return 0;
    }
    dfs

    看到大家都是 bfs,确实找最小步数的话应该是 bfs 呢;

    用了好多 STL,学到了...

    思路没什么,就是不太好写,使用 STL 感觉很方便。

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<map>
    using namespace std;
    int n;
    string a,b,c[10],d[10];
    map<string,int>mp;
    queue<pair<string,int> >q;
    int main()
    {
        cin>>a>>b;
        while(cin>>c[++n])cin>>d[n];
        n--; mp[a]=0;
        q.push(make_pair(a,0));
        while(q.size())
        {
            string s=q.front().first; int t=q.front().second; q.pop();
            int l=s.length();
            if(t>10)break;
            for(int i=1;i<=n;i++)
            {
                int l2=c[i].length();
                for(int j=0;j<=l-l2;j++)
                {
                    if(s.substr(j,l2)!=c[i])continue;
                    string ns; ns.clear();//
                    if(j)ns+=s.substr(0,j);//(起点,起点开始的长度)
                    ns+=d[i];
                    if(j+l2<l)ns+=s.substr(j+l2,l-j-l2+1);
                    if(ns==b){printf("%d
    ",t+1); return 0;}
                    if(mp.find(ns)==mp.end())
                    {
                        mp[ns]=t+1;
                        q.push(make_pair(ns,t+1));
                    }
                }
            }
        }
        printf("NO ANSWER!");
        return 0;
    }
  • 相关阅读:
    Python 进度条
    python多线程的使用
    Python 进程间通信问题—Manager方法
    生产消费者模型(进程通信,队列)
    进程锁 购票问题
    多进程并行实现socket并发代码
    一次完整的socket文件的传输
    python实现基本计算器(可处理括号和负值)
    模拟论坛登录
    JS
  • 原文地址:https://www.cnblogs.com/Zinn/p/9382846.html
Copyright © 2011-2022 走看看