题目描述
已知有两个字串 A,B A , B 及一组字串变换的规则(至多6个规则):
A1−>B1 A 1 − > B 1
A2−>B2 A 2 − > B 2
规则的含义为:在A的子串中 A1 A 1 可以变成 B1 B 1 , A2 A 2 可以变成 B2 B 2 …..
求 A A 变成 B B 所需的最小的转换次数
输入
A1 B1 A 1 B 1
A2 B2 A 2 B 2
A3 B3 A 3 B 3
….
输出
最小的转换次数
例子
abaaaba abcdaba
a b
b d
d e
e f
f g
g c
输出
8
解题思路
广度优先搜索,注意队列里面字符串判重(利用map),熟悉string::find和string::replace用法
#include
#include
#include
#include
using namespace std;
struct E{
string now;
int cnt;
};
int n=0;
string ori[10],dis[10];
queue Q;
string a,b;
map<string ,int> map1;
bool bfs(){
while(!Q.empty()){
E node=Q.front();
Q.pop();
string tmp=node.now;
if(node.cnt>10){
cout<<"NO ANSWER!"<return 1;
}
// cout<
for(int i=0;ifor (int pos=tmp.find(ori[i]);pos1)){
//对ori[i]中的字符串依次判断,找出符合替代的字符串
if(pos!=string::npos){
string tmpstr=tmp;
tmpstr.replace(pos,ori[i].length(),dis[i]);
if(tmpstr==b){
cout<1<return 1;
}
if(!map1.count(tmpstr)){//判重
E nowe;
map1[tmpstr]=1;
nowe.now=tmpstr;
nowe.cnt=node.cnt+1;
Q.push(nowe);
}
}
}
}
}
return 0;
}
/*
s1.find(s2,pos);
s1.replace(pos,s2.size(),s3);
*/
int main(int argc, char** argv) {
cin>>a>>b;
while(cin>>ori[n]>>dis[n])
n++;
E start;
start.cnt=0,start.now=a;
Q.push(start);
if(!bfs()){
cout<<"NO ANSWER!"<return 0;
}