rt,单向bfs感觉有问题但又没看出来哪里有问题。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double lb;
string s,t;
vector<string> vta,vtb;
string bian(string a,int rule){
string ans="";
string x=vta[rule],y=vtb[rule];
int cnt=0,st=0;
for(int i=0;i<(int)a.size();i++){
cnt=0;
bool f=1;
for(int j=i;j<(int)a.size()&&j<(int)(i+x.size());j++){
if(a[j]!=x[cnt]){
f=0;
break;
}
cnt++;
}
if(f){
st=i;
break;
//要是有多个可以换的字符串呢?
}
}
if(cnt==(int)x.size()){
for(int i=0;i<st;i++) ans+=a[i];
ans+=y;
for(int i=st+x.size();i<(int)a.size();i++) ans+=a[i];
}
return ans;
}
int ans=1e9;
struct node{
string x;
int num=0;
};
queue<node> que;
void bfs(){
que.push({s,0});
while(!que.empty()){
node a=que.front();
que.pop();
if(a.num>10) continue;
if(a.x==t){
ans=min(ans,a.num);
continue;
}
for(int i=0;i<(int)vta.size();i++){
string b=bian(a.x,i);
if(b!=""){
que.push({b,a.num+1});
//cout<<b<<" "<<a.num+1<<"\n";
}
}
}
}
int main(){
string a,b;
cin>>s>>t;
while(cin>>a>>b){
if(a=="0"&&b=="0") break;
vta.push_back(a);
vtb.push_back(b);
}
bfs();
if(ans==1e9) printf("NO ANSWER!");
else printf("%d",ans);
return 0;
}
/*
aaaaaab aaaaaa
aaaab aaaa
*/