题目大意:
给定A,B两个字符串和若干条变化规则(至多6条),如果能在10的步骤将A变成B,输出步数,否则输出NO ANSWER!
思路:
广搜,具体见代码。
code:
#include<bits/stdc++.h>//万能头文件YYDS
using namespace std;//我也不知道这是什么
struct node{//结构体
string A,B;//变化规则
}p[7];//数组
string t1,t2,S,T;//S是原字符串,T是目标字符串
int n;//记录规则个数
map<string,bool>vis;//标记数组,标记某个字符串是否被递归过
map<string,int>f;//记录变化步数
queue<string> q;//bfs主要东西,队列!
void bfs(){//开始bfs
q.push(S); //将初始字符串存入队列
f[S]=0;//步数归零
vis[S]=true;//将此字符串标记
while(!q.empty()){//如果队列没有空
string tmp=q.front();//求出队列顶端字符串
q.pop();//将其弹出
if(f[tmp]==10){//如果步数要超过10
break;//结束
}
int lentmp=tmp.size();//记录长度
for(int i=1;i<=n;i++){//循环遍历每条规则
int lena=p[i].A.size();//记录长度
for(int j=0;j+lena<=tmp.size();j++){//枚举整个字符串
if(tmp.substr(j,lena)==p[i].A){//substr(i,j)表示从字符串中提取出下标为i~j的字符串。如果提取出的字符串可以变化
string v=tmp.substr(0,j)+p[i].B+tmp.substr(j+lena,lentmp-(j+lena)); //用字符串v存储变化后的字符串
if(!vis[v]){//如果这个字符串没有被遍历过
f[v]=f[tmp]+1;//步数增加
vis[v]=true;//标记
if(v==T){//如果变化后的字符串与目标字符串相等
return;//结束bfs
}
q.push(v);//将变化后的字符串存进队列
}
}
}
}
}
}
int main(){//主函数
cin>>S>>T;//输入初始字符串和目标字符串
while(cin>>t1>>t2){//输入变化规则
p[++n]=node{t1,t2};//用结构体来存储变化规则
}
bfs();//开始广度优先搜索
if(!vis[T]){//如果不可以将初始字符串变成目标字符串
cout<<"NO ANSWER!";//输出NO ANSWER!
}else{//否则
cout<<f[T];//输出步数
}
return 0; //然后我们就可以愉快的结束代码啦!!!
}