Loading

洛谷 P1032 子串变换

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

本题是一道bfs问题,从a串开始,每一步完成替换一对字符串(但是一个一步替换可以将这对字符串替换好几次,比如a串是 ABCABCABCABC 一对替换是BC替换成ED,那么一步替换是将 ABCABCABCABC 替换成 AEDAEDAEDAED )如果十步以内转换成b就输出

本题还让蒟蒻学习了一下map的用法 真的十分好用 c++的stl真是A题利器

具体放代码吧:

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 string a,b;
 6 string sa[10],sb[10];
 7 map<string,int>maps;  //用来判重,达到剪枝的效果
 8 queue<string>q;     //用来存转换出的字符串
 9 queue<int>nq;       //存当前的步数
10 int n,k=-1;
11 
12 void bfs()
13 {
14     int i;
15     while(!q.empty())      
16     {
17         if(nq.front()>10)      //超过十步,跳出循环
18         break;
19         if(q.front()==b)      
20         {
21             k=nq.front();    //到了b就更新k 跳出
22             break;
23         }
24         if(maps[q.front()]==1)        //如果当前的字符串搜索过,就pop掉 别忘了continue!
25         {
26             q.pop();
27             nq.pop();
28             continue;
29         }
30         maps[q.front()]=1;    //没有的话就标记上 起到剪枝的效果
31         
32         for(i=0;i<n;i++)
33         {
34             string s=q.front(),ss;
35              while(1)
36              {
37                  int m=s.find(sa[i]);   //寻找第一次出现sa[i]的位置
38                  if(m==-1) //找不到 说明能和sa[i]换的都换了 跳出while循环
39                  break;
40                  ss=q.front();
41                  ss.replace(m,sa[i].size(),sb[i]); 
42                  q.push(ss);
43                  nq.push(nq.front()+1);
44                  s[m]='#';   //将匹配的地方替换成一个不相关的字符,这样就可以找到下一个匹配的地方
45              }
46         }
47         q.pop();
48         nq.pop();
49     }
50     if(k==-1)
51     cout<<"NO ANSWER!";
52     else
53     cout<<k;
54 }
55 
56 
57 int main()
58 {
59     cin>>a>>b;
60     while(cin>>sa[n]>>sb[n])  //因为不知道会输入几个字符串,需要用while输入
61     n++;
62     q.push(a);
63     nq.push(0);
64     bfs();
65 }

 

posted @ 2019-04-01 21:46  WinterFa1L  阅读(157)  评论(0编辑  收藏  举报