NOIP2002提高组 字串变换
使用C++的string,跑一遍BFS,就可以解决。唯一的问题是怎么判断某个字符串是否出现过??可以考虑一下C++的set和map。这里使用set。
#include <cstdio>
#include <string>
#include <iostream>
#include <set>
using namespace std;
string Begin,End;
struct{
string a,b;
}Node[10];
set<string> vis;
int tot=0;
string que[10000000];
inline int bfs(){
int cnt,head=1,tail=1,ans=0;
que[1]=Begin;
if(Begin==End)return 0;
while(head<=tail){
if(ans==10)return -1;
cnt=0;
ans++;
for(register int i=head;i<=tail;i++){
int len=que[i].length();
for(register int j=0;j<tot;j++){
int len_Node=Node[j].a.length();
for(register int k=0;k+len_Node<=len;k++){
string cmp=que[i].substr(k,len_Node);
if(cmp==Node[j].a){
string wait=que[i].substr(0,k)+Node[j].b+que[i].substr(k+len_Node,len-(k+len_Node));
if(vis.count(wait))continue;
cnt++;
que[tail+cnt]=wait;
vis.insert(wait);
if(que[tail+cnt]==End)return ans;
}
}
}
}
head=tail+1;
tail+=cnt;
}
return -1;
}
int main() {
cin>>Begin>>End;
while(cin>>Node[tot].a>>Node[tot].b)tot++;
int answer=bfs();
if(answer!=-1)printf("%d\n",answer);
else puts("NO ANSWER!");
return 0;
}