题目描述
样例
#include<bits/stdc++.h>
using namespace std;
const int N=10;
string A,B;
string a[N],b[N];
int n;
unordered_map<string,int> da,db;
const int INF=0x3f3f3f;
int bfs(){
queue<string>qa,qb;
qa.push(A),qb.push(B);
da[A]=0,db[B]=0;
while(qa.size()&&qb.size()){
string u=qa.front();
qa.pop();
if(db.count(u))return da[u]+db[u];
for(int i=0;i<u.size();i++)
for(int j=0;j<n;j++){
if(u.substr(i,a[j].size())==a[j]){
string ts=u.substr(0,i)+b[j]+u.substr(i+a[j].size());
if(!da.count(ts)){
qa.push(ts);
da[ts]=da[u]+1;
}
}
}
u=qb.front();
qb.pop();
if(da.count(u))return da[u]+db[u];
for(int i=0;i<u.size();i++)
for(int j=0;j<n;j++){
if(u.substr(i,b[j].size())==b[j]){
string ts=u.substr(0,i)+a[j]+u.substr(i+b[j].size());
if(!db.count(ts)){
qb.push(ts);
db[ts]=db[u]+1;
}
}
}
}
return INF;
}
int main(){
cin>>A>>B;
while(cin>>a[n]>>b[n])n++;
int ans=bfs();
if(ans>10)cout<<"NO ANSWER!";
else cout<<ans<<endl;
return 0;
}
双向广搜也太++了,熟练度有待提高..