闲谈:emm,明天开始就要自闭了,今天的题水的一批,自己还水了那么久的群,以及水了一个考试,还看cyq直播,真的shabi...
双向bfs往往比单向bfs更优,至于为什么?自己画个图就懂了?
下面讲讲这个题怎么做?
双向bfs两个点,起点和终点.然后进行枚举每个变换..最后有交接就是答案了.
代码:(建议双向广搜就拿这个当模板吧)
#include <bits/stdc++.h> using namespace std; const int N=6; string A,B; int n=0; string a[N],b[N]; int extend(queue<string>&q,unordered_map<string,int>&disa,unordered_map<string,int>&disb,string a[],string b[]) { auto t=q.front();q.pop(); for(int i=0;i<(int)t.size();i++)//枚举每个变换的起点. { for(int j=0;j<n;j++)//枚举可能的变换. { if(t.substr(i,a[j].size())!=a[j]) continue; string new_t=t.substr(0,i)+b[j]+t.substr(i+a[j].size()); if(disa.count(new_t)) continue; if(disb.count(new_t)) return disa[t]+disb[new_t]+1; disa[new_t]=disa[t]+1; q.push(new_t); } } return -1; } int bfs()//对A和B进行bfs. { unordered_map<string,int>disa,disb;//从起点搜的距离和从终点搜的距离. queue<string>qa,qb; qa.push(A);disa[A]=0; qb.push(B);disb[B]=0; while(qa.size()&&qb.size())//假如两个中一旦有一个不能扩展了,那么就可以直接退出了. { int t; if(disa[qa.front()]+disb[qb.front()]>10) return 11; if(qa.size()<=qb.size()) //搜起点. { t=extend(qa,disa,disb,a,b); } else//搜终点. { t=extend(qb,disb,disa,b,a); } if(t!=-1) return t; } return 11; } int main() { cin>>A>>B; while(cin>>a[n]>>b[n]) n++;//n个字符串 //a->b. if(bfs()>10) puts("NO ANSWER!"); else cout<<bfs()<<endl; return 0; }