0
点赞
收藏
分享

微信扫一扫

字串变换----双向广搜

mjjackey 2022-01-09 阅读 58
c++算法

字串变换

题目链接

在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <queue>

using namespace std;
const int N = 6;
string a[N],b[N];
string A,B;
int idx=0;
int extend(queue<string>&q,unordered_map<string,int>&nowd,unordered_map<string,int>&red,string now[],string re[])
{
    string s=q.front();
    q.pop();
    for(int i=0;i<s.size();i++)
    {
        for(int j=0;j<idx;j++)
        {
            if(s.substr(i,now[j].size())==now[j])
            {
                string str=s.substr(0,i)+re[j]+s.substr(i+now[j].size());
                if(nowd.count(str))continue;
                if(red.count(str))return nowd[s]+1+red[str];
                nowd[str]=nowd[s]+1;
                q.push(str);
            }
        }
    }
    return 11;
}
int bfs()
{
    unordered_map<string,int> da,db;
queue<string> qa,qb;
    qa.push(A);da[A]=0;
    qb.push(B);db[B]=0;
    int t=0;
    while(qa.size()&&qb.size())
    {
        if(qa.size()<qb.size())t=extend(qa,da,db,a,b);
        else t=extend(qb,db,da,b,a);
        if(t<=10)return t;
    }
    return 11;
}
int main()
{
    cin>>A>>B;
    if(A==B)
    {
        cout<<0<<endl;
        return 0;
    }
    while(cin>>a[idx]>>b[idx])idx++;
    int t=bfs();
    if(t>10)cout<<"NO ANSWER!"<<endl;
    else cout<<t<<endl;
}
举报

相关推荐

0 条评论