一开始用dfs写,超时,改为bfs,依旧超时,用的是substr可能这个时间长一点,下面这个就ac了
有人说用双向搜索,我感觉挺麻烦的,,,呃呃呃
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
map<string,bool> m;
string d[100010],e,a[7],b[7];
int tim[100010];
int main()
{
int h=0,t=1;
cin>>d[0]>>e;
tim[0]=1;
int n=0;
while(cin>>a[n]>>b[n]) n++;
while(tim[h]<10&&tim[h]!=0){//到状态h需要的步数
for(int i=0;i<n;i++)//尝试 每一种规则
{
//找到第一个出现的位置
int pos=d[h].find(a[i]);
while(pos!=d[h].npos){//npos表示不存在,也就是只要存在可替换的字符就去替换他
d[t]=d[h];
d[t].replace(pos,a[i].size(),b[i]);
tim[t]=tim[h]+1;
if(d[t]==e){ cout<<tim[h]<<endl; return 0; }
if(m.find(d[t])==m.end()) m[d[t++]]=true;
pos=d[h].find(a[i],pos+1); //找下一个出现的位置
}
}
h++;
}
cout<<"NO ANSWER!"<<endl;
return 0;
}
还是以后遇到双向搜索的题再说吧,