#include<iostream>
#include<map>
using namespace std;
string x1,x2,s1[20],s2[20];
int n=1,maxlen=-1,minlen=0x7fffffff,flag=0,ans=0x7fffffff;
map<string,int>m;
void dfs(string s,int step)
{
if(step>10) return;
if(s==x2)
{
ans=min(ans,step);
flag=1;
return;
}
int tmplen=s.length();
if(s.length()<minlen) return;
if(flag && step>=ans) return;
for(int i=1;i<n;i++)//遍历寻找可以被替换的字符串
{
for(int k=0;k<=s.length()-s1[i].length();k++)//遍历字符串
{
if(s[k]!=s1[i][0]) continue;//首字母不同跳过
else//首字母与可被替换字符串的首字母相同
{
string strtmp=s.substr(k,s1[i].length());//剪切出子字符串
if(strtmp==s1[i])//子字符串符合条件
{
string tmpstr=s;
tmpstr.replace(k,s1[i].length(),s2[i]);
//m[tmpstr]代表初始字符串转变为tmpstr所需的最小步数
if(!m[tmpstr] || step+1<m[tmpstr])//当前字符串未被访问过或找到更优解
{
m[tmpstr]=step+1;//改变状态
dfs(tmpstr,step+1);//搜索下一步
}
}
}
}
}
}
int main()
{
cin >> x1 >> x2;
while(cin >> s1[n] >> s2[n])
{
int tmplen=s1[n].length();
//maxlen=max(maxlen,tmplen);
minlen=min(minlen,tmplen);
n++;
}
dfs(x1,0);
if(!flag) cout << "NO ANSWER!";
else cout << ans;
}
第四个点MLE
第四个点的测试数据:
a aaaaa
a a112233445566778899
778899 a
112233 a
445 a
566 a
55 a