题目链接:https://www.acwing.com/problem/content/192/
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int n,m,x,y,k;
string a[N],b[N],A,B;
vector<int>g[N];
map<int,int>mp,mk;
int zio(queue<string>&q,unordered_map<string,int>&da,unordered_map<string ,int>&db,string a[],string b[]){
string t=q.front();
q.pop();
for(int i=0;i<t.size();i++){//遍历每一个位置
for(int j=0;j<n;j++){//遍历规则
if(t.substr(i,a[j].size())==a[j]){
string r=t.substr(0,i)+b[j]+t.substr(i+a[j].size());
if(db.count(r))return da[t]+1+db[r];//如果找到另一个方向中的元素
if(da.count(r))continue;//如果相同就跳过
da[r]=da[t]+1;
q.push(r);
}
}
}
return 11;
}
int bfs(){
int t;
if(A==B)return 0 ;
queue<string >qa,qb;
unordered_map<string ,int >da,db;
da[A]=0,db[B]=0;
qa.push(A);//头队列
qb.push(B);//尾队列
while(qa.size()&&qb.size()){
if(qa.size()<=qb.size())//先对搜索树小的队列进行处理
t=zio(qa,da,db,a,b);//意思是qa这个队列使da增加更多的元素,寻找是否等于db中的元素,变换规则是a->b
else t=zio(qb,db,da,b,a);
if(t<=10)return t;//再循环结束之前如果没找到,则t为11进行下一次循环,否则输出t
}return 11;//循环结束后依旧没找到则输出大于10的一个数
}
void solve () {
cin>>A>>B;
while(cin>>a[n]>>b[n])n++;
int t=bfs();
if(t>10)puts("NO ANSWER!");
else cout<<t<<endl;
}
signed main () {
int T = 1;
std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
//cin>>T;
while (T --) solve ();
return 0;
}