感觉这样的代码…大概还需要很久自己才能写出来叭
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<map>
#define maxn 15
using namespace std;
struct node{
string str;
int step;
};
string a,b;
string ori[maxn];
string tra[maxn];
int n,ans;
map<string,int> ma;//判重
string trans(const string &str,int i,int j)
{
string ans="";
if(i+ori[j].length()>str.length())
return ans;
for(int k=0;k<ori[j].length();k++)
if(str[k+i]!=ori[j][k])
return ans;
ans=str.substr(0,i);//从0开始的i个字符
ans+=tra[j];
ans+=str.substr(i+ori[j].length());
return ans;
}
void bfs()
{
queue<node> q;
node s;
s.str=a;
s.step=0;
q.push(s);
while(!q.empty())
{
node u=q.front();
q.pop();
string temp;
if(ma.count(u.str)==1)//剪枝,判断重复的路径
continue;
if(u.str==b)
{
ans=u.step;
break;
}
ma[u.str]=1;
for(int i=0;i<u.str.length();i++)//枚举当前串所有可能位置
for(int j=0;j<n;j++)//枚举所有可能方式
{
temp=trans(u.str,i,j);
if(temp!="")
{
node v;
v.str=temp;
v.step=u.step+1;
q.push(v);
}
}
}
if(ans>10||ans==0)
cout<<"NO ANSWER!"<<endl;
else
cout<<ans;
}
int main()
{
cin>>a>>b;
while(cin>>ori[n]>>tra[n])
n++;
bfs();
return 0;
}