字串变换
字串变换
这道题用双向广搜会比单向快得多(设每次扩展是
注意
,特判 。
#include<bits/stdc++.h>
using namespace std;
#define Ls(i,l,r) for(int i=l;i<r;++i)
#define Rs(i,l,r) for(int i=r;i>l;--i)
#define L(i,l) for(int i=0;i<l;++i)
const int N=6;
string A,B,a[N],b[N];
int n;
int extend(queue<string>&q,unordered_map<string, int>&da,unordered_map<string, int>db,string a[],string b[]){
int d=da[q.front()];
while(!q.empty()&&da[q.front()]==d){
auto t=q.front();q.pop();
L(i, n)
L(j, t.size())
if(t.substr(j,a[i].size())==a[i]){
string r=t.substr(0,j)+b[i]+t.substr(j+a[i].size());
if(db.count(r))return d+db[r]+1;
if(da.count(r))continue;
da[r]=d+1;
q.emplace(r);
}
}
return 11;
}
int bfs(){
queue<string>qa,qb;
unordered_map<string, int>da,db;
qa.emplace(A);
qb.emplace(B);
da[A]=db[B]=0;
int step=0;
while(!qa.empty()&&!qb.empty()){
int lena=qa.size(),lenb=qb.size(),t;
if(lena<lenb)t=extend(qa, da, db, a, b);
else t=extend(qb, db, da, b, a);
if(t<=10)return t;
if(++step==10)return -1;
}
return -1;
}
int main(){
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
// ios::sync_with_stdio(0);
// cin.tie(0);
// cout.tie(0);
cin>>A>>B;
if(A==B)return puts("0"),0;
while(cin>>a[n]>>b[n])n++;
int t=bfs();
if(t==-1)puts("NO ANSWER!");
else printf("%d",t);
return 0;
}
本文作者:wscqwq
本文链接:https://www.cnblogs.com/wscqwq/p/17416761.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步