字串变换RE0求调

image
image
代码:

#include<bits/stdc++.h>
using namespace std;
string a,b;
struct node{
    string f,t;
}p1[6],p2[6];
int cnt1,cnt2;
struct bfs_cond{
    string p;
    int tp;
};
void change(string& s,int spos,int epos,string t){
    s.replace(s.begin()+spos,s.begin()+epos+1,t);
}
map<string,int>vis;
map<string,int>step;
bool expand(bfs_cond s,queue<bfs_cond>& q){
    if(s.tp==1){
        for(int i=0;i<cnt1;i++){
            for(int j=0;j+p1[i].f.size()-1<s.p.size();j++){
                string tmp=s.p.substr(j,p1[i].f.size());
                if(tmp==p1[i].f){
                    string next=s.p;
                    change(next,j,j+p1[i].f.size()-1,p1[i].t);
                    if(vis[next]==0){
                        step[next]=step[s.p]+1;
                        vis[next]=1;
                        q.push({next,1});
                    }else if(vis[next]==2){
                        if(step[next]+step[s.p]+1<=10){
                            cout<<step[next]+step[s.p]+1;
                            return 1;
                        }
                    }
                }
            }
        }
    }else{
        for(int i=0;i<cnt2;i++){
            for(int j=0;j+p2[i].f.size()-1<s.p.size();j++){
                string tmp=s.p.substr(j,p2[i].f.size());
                if(tmp==p2[i].f){
                    string next=s.p;
                    change(next,j,j+p2[i].f.size()-1,p2[i].t);
                    if(vis[next]==0){
                        step[next]=step[s.p]+1;
                        vis[next]=2;
                        q.push({next,2});
                    }else if(vis[next]==1){
                        if(step[next]+step[s.p]+1<=10){
                            cout<<step[next]+step[s.p]+1;
                            return 1;
                        }
                    }
                }
            }
        }
    }
}
void bfs(){
    queue<bfs_cond>q1,q2;
    q1.push({a,1});
    q2.push({b,2});
    vis[a]=1;
    vis[b]=2;
    while(q1.size()&&q2.size()){
        bfs_cond now1=q1.front();
        q1.pop();
        if(expand(now1,q1))return;
        bfs_cond now2=q2.front();
        q2.pop();
        if(expand(now2,q2))return;
    }
    cout<<"NO ANSWER!";
}
int main(){
    cin>>a>>b;
    string t1,t2;
    while(cin>>t1>>t2){
        p1[cnt1++]={t1,t2};
        p2[cnt2++]={t2,t1};
    }
    bfs();
    return 0;
}