闲谈: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;
}
京公网安备 11010502036488号