洛谷 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("\n");
}
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\n",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\n",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;
}

 

posted @ 2018-07-28 17:56  Zinn  阅读(162)  评论(0编辑  收藏  举报