这题考察对string的运用和bfs。
#include<iostream>
#include<string>
#include<queue>
#include <map>
#include <cstring>
#define maxn 15
using namespace std;
struct node
{
string str;
int step;
};
string a,b,start[maxn],end[maxn];
int n=0,ans=0;//n-1用来储存变化规则的个数
map<string,int>ma;//用map去重
string trans(const string &str,int i,int j)//j代表第j个变化规则,i表示从原字串的第几位开始匹配
{
string ans="";
if(i+start[j].length()>str.length()) return ans;
for(int k=0;k<start[j].length();k++)
if(str[i+k]!=start[j][k]) return ans;//匹配字串
ans=str.substr(0,i);
ans+=end[j];
ans+=str.substr(i+start[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<<endl;
}
int main()
{
cin>>a>>b;
while(cin>>start[n]>>end[n]) n++;
bfs();
return 0;
}