蒻篛求助,wa了2,5点,用的双向广搜
查看原帖
蒻篛求助,wa了2,5点,用的双向广搜
582113
xuan132楼主2022/1/15 15:12
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <unordered_map>
using namespace std;
string A,B,a[6],b[6];
unordered_map<string,int>da,db;
queue<string>Q1,Q2;
int num=0;
int extrend(int tt)
{
    if(tt==1)
    {
        string state=Q1.front();Q1.pop();
        for(int i=0;i<num;i++)
        {
            int h=state.find(a[i]);
            if(h!=-1)
            {
                string source=state;
                state.replace(h,a[i].size(),b[i]);
                if(!da[state])
                {
                    da[state]=da[source]+1;
                    Q1.push(state);
                }
            }
            if(db[state]||state==A||state==B)
            {
                return db[state]+da[state];
            }
            if(da[state]+db[state]>10)return -1;
        }
    }
    else 
    {
        string state=Q2.front();Q2.pop();
        for(int i=0;i<num;i++)
        {
            int h=state.find(b[i]);
            if(h!=-1)
            {
                string source=state;
                state.replace(h,b[i].size(),a[i]);
                if(!db[state])
                {
                    db[state]=db[source]+1;
                    Q2.push(state);
                }
            }
            if(da[state]||state==A||state==B)
            {
                return da[state]+db[state];
            }
            if(db[state]+da[state]>10)return -1;
        }
    }
    return 0;
}
int bfs(string A,string B)
{
    Q1.push(A),Q2.push(B);
    da[A]=0,db[B]=0;int tt=1,t=0;
    while(Q1.size()&&Q2.size())
    {
        if(tt==1)
        {
            int h1=extrend(tt);
            if(h1!=-1&&h1!=0)
            {
                t=h1;break;
            }
            else if(h1==-1)return 0;
        }
        else 
        {
            int h1=extrend(tt);
            if(h1!=-1&&h1!=0)
            {
                t=h1;break;
            }
            else if(h1==-1)return 0;
        }
        Q1.size()>Q2.size()?tt=-1:tt=1;
    }
    if(t!=0)return t;
    else return 0;
} 
int main()
{
    cin>>A>>B;
    while(cin>>a[num]>>b[num])num++;
    int c=bfs(A,B);
    if(c)
    cout<<c;
    else cout<<"NO ANSWER!";
    return 0;
 } 
2022/1/15 15:12
加载中...