[NOIP提高组2002]字串变换

题目描述:
已知有两个字串 A ,B 及一组字串变换的规则(至多6个规则):
     A1 >B1
     A2 >B2
  规则的含义为:在 A$中的子串 A1 B1 、A2 B2 …。
   例如:A abcdB =’xyz’
 变换规则为:
 abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’
则此时,A B ,其变换的过程为:
‘abcd’->‘xud’->‘xy’->‘xyz’
共进行了三次变换,使得 A B

输入:
第一行为两个字符串,第二行至文件尾为变换规则
输出:
若在 10 步(包含 10步)以内能将 A B ,则输出最少的变换步数;否则输出”NO ANSWER!”
题解:
stl大法好,
s.replace(pos,len,s2) //删除s中下标为pos起的长度len个字符,并在pos位置插入字符串s2
s.find(s2,pos) //在s中查找s2第一次出现的位置
直接广搜就好了,看题解可以双向广搜,自己没想到。
stl还是不是太熟,以后要多练。

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
string s1,s2;
string sa[10],sb[10];//由sa变成sb 
int n=0;
int ans;
queueq[4];
mapint>ma[3];
int bfs()
{
    ma[1][s1]=1;ma[2][s2]=1;
    q[1].push(s1);q[2].push(s2);
    while(q[1].empty()==false&&q[2].empty()==false)
    {
        int yu;if(q[1].size()<q[2].size()) yu=1;else yu=2;
        string s;
        s=q[yu].front();
        if(yu==1)
        {
            for(int i=1;i<=n;i++)
            {
                int k=0;
                while(s.find(sa[i],k)!=-1)
                {
                    k=s.find(sa[i],k);
                    int len=sa[i].size();
                    s.replace(k,len,sb[i]);
                    if(ma[1][s]==0)
                    {
                        ma[1][s]=ma[1][q[1].front()]+1;
                        q[1].push(s);
                    }
                    if(ma[2][s]!=0)
                    {
                        int temp=ma[2][s]+ma[1][q[1].front()]-1;
                        if(temp<=10)return temp;
                    }
                    k++;
                    s=q[yu].front();
                }
            }

        }
        else
        {
            for(int i=1;i<=n;i++)
            {
                int k=0;
                while(s.find(sb[i],k)!=-1)
                {
                    k=s.find(sb[i],k);
                    int len=sb[i].size();
                    s.replace(k,len,sa[i]);
                    if(ma[2][s]==0)
                    {
                        ma[2][s]=ma[2][q[2].front()]+1;
                        q[2].push(s);
                    }
                    if(ma[1][s]!=0)
                    {
                        int temp=ma[1][s]+ma[2][q[2].front()]-1;
                        if(temp<=10)return temp;
                    }
                    k++;
                    s=q[yu].front();
                }
            }
        }
        q[yu].pop();
    }
    return -1;
}
int main()
{
    cin>>s1>>s2;
    while(cin>>sa[n+1]>>sb[n+1]) 
    {
        n++;
        //if(n==3) break;
    }
    ans=bfs();
    if(ans==-1) printf("NO ANSWER!");
    else printf("%d",ans);
}

你可能感兴趣的:(历年noip)