【NOIp 2002】【BFS+STL】字串变换
描述
已知有两个字串 A
A1
A2
规则的含义为:在 A$中的子串 A1
例如:A
变换规则为:
‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’
则此时,A
‘abcd’->‘xud’->‘xy’->‘xyz’
共进行了三次变换,使得 A
格式
输入格式
第一行为两个字符串,第二行至文件尾为变换规则
A
A1
A2
… … /
所有字符串长度的上限为 20。
输出格式
若在 10 步(包含 10步)以内能将 A
代码
BFS…再加上那么一点点STL小技巧、
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <map>
#define INF 1000
using namespace std;
struct Trans{
string a,b;
Trans(const string &a,const string &b){
this->a=a; this->b=b;
}
};
int n=1,d[1000],ans=20;
string A,B;
string a,b;
vector<Trans> trans;
map<string,int> dic;
bool bfs(){
queue<string> q;
q.push(A); dic[A]=0;
while(!q.empty()){
const string temp=q.front(); q.pop();
if(dic[temp]>10) return false;
if(temp==B) {
ans=dic[temp]; return true;
}
for(int i=0;i<(int)trans.size();i++){
int pos=temp.find(trans[i].a);
while(pos!=(int)string::npos){
string t2(temp);
t2.replace(pos,trans[i].a.length(),trans[i].b);
if(dic.count(t2)==0) {
q.push(t2); dic[t2]=dic[temp]+1;
}
pos=temp.find(trans[i].a,pos+1);
}
}
}
return false;
}
int main(){
freopen("in.txt","r",stdin);
cin>>A>>B;
while(cin>>a>>b) trans.push_back(Trans(a,b));
if(bfs()) printf("%d",ans);
else printf("NO ANSWER!");
return 0;
}