LuoguP1032 字符变换(BFS)

题目链接为:https://www.luogu.org/problemnew/show/P1032

思路:看到数据比较小,而且最多有6个规则,就可以用搜索去做了,我用的BFS,大体思路如下:

  1. 定义结构体表示状态,其中包括字符串str和当前步数num;并定义该结构体的队列;
  2. 用map实现string到int的映射,用来记录某个状态是否到达过,若到达过,标记为1,否则为0;
  3. bfs函数中就是bfs的经典模块,有个难点是从当前状态搜时,不仅要考虑遍历每一个规则的情况,而且要注意在某一规则中母串中可能有多个字串可以被替换,必须都考虑到,否则会被第5个数据卡。

下面是AC代码:

 

 1 #include<cstdio>
 2 #include<string>
 3 #include<queue>
 4 #include<iostream>
 5 #include<map>
 6 using namespace std;
 7 
 8 struct node{
 9     string str;
10     int num;
11 }nod;
12 
13 queue<node> q;
14 map<string,int> m;
15 string a,b;
16 string aa[6],bb[6];
17 int n=0;
18 
19 void bfs(){
20     q.push(nod);
21     while(!q.empty()){
22         node now=q.front();q.pop();
23         string ns=now.str;
24         int nn=now.num;
25         if(nn>10){
26             printf("NO ANSWER!\n");
27             return;
28         }
29         if(ns==b){
30             printf("%d\n",nn);
31             return;
32         }
33         for(int i=0;i<n;i++){
34             int index=ns.find(aa[i],0);
35             while(index!=string::npos){
36                 string tmp=ns;
37                 tmp.replace(index,aa[i].length(),bb[i]);
38                 if(!m[tmp]){
39                     m[tmp]=1;
40                     nod.str=tmp;
41                     nod.num=nn+1;
42                     q.push(nod);
43                 }
44                 index=ns.find(aa[i],index+aa[i].length());
45             }
46         }
47     }
48     printf("NO ANSWER!\n");
49 }
50 
51 int main(){
52     cin>>a>>b;    
53     while(cin>>aa[n]>>bb[n])
54         n++;
55     nod.str=a;
56     nod.num=0;
57     m[a]=1;
58     bfs();
59     return 0;
60 }

 

posted @ 2019-01-27 17:42  Frank__Chen  阅读(188)  评论(0编辑  收藏  举报