在做这种题头脑中能根据变化规则构建一副变化图,寻找图的最短路,求最短路根据bfs,然后我们优化bfs为双向bfs
#include <bits/stdc++.h>
#define ll long long
#define INF 0x7f7f7f7f
using namespace std;
typedef pair<int,int> PII;
const int N=20+10;
int n,m,ans;
string a[N],b[N];
int extend(queue<string> &q,map<string,int> &da,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]){//substr[)函数
// eg:abcd 其中bc-->x 则拼接过程为 abcd-->axd
string state=t.substr(0,i)+b[j]+t.substr(i+a[j].size());//形成新的字符串
if(db.count(state))return da[t]+1+db[state];//返回步数和
if(da.count(state))continue;//a队列曾经包含过,那么它一定不是最短路了
da[state]=da[t]+1;//更新距离
q.push(state);
}
}
}
return 11;
}
int bfs(string A,string B) {
queue<string> qa,qb;
map<string,int> da,db;//存放到每个字符串的距离
qa.push(A),da[A]=0;
qb.push(B),db[B]=0;
while(qa.size()&&qb.size()) {
int t;
if(qa.size()<=qb.size()) {//哪个队列小哪个先出队优化
t=extend(qa,da,db,a,b);//a-->b
} else t=extend(qb,db,da,b,a);//b-->a
if(t<=10)return t;
}
return 11;//不符合题意
}
int main() {
string A,B;
cin>>A>>B;
if(A==B){//特判
cout<<0;
}
while(cin>>a[n]>>b[n]) n++;
int step=bfs(A,B);
if(step>10)cout<<"NO ANSWER!"<<endl;
else cout<<step<<endl;
return 0;
}