NOIP2002 字符变换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NOIP2002 字符变换相关的知识,希望对你有一定的参考价值。

啊本来以为2002的题应该会比较友善于是很naive地像模拟一样用着stl乱玩结果死也过不了最后一个点qaq

心情很悲痛于是为了解放自我

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<string>
 7 #include<map>
 8 using namespace std;
 9 string a,b,aa[8],bb[8];
10 string q[10000010];
11 int tt[10000010];
12 map <string,bool> k;
13 int main(){
14 //    freopen ("string.in","r",stdin);
15 //    freopen ("string.out","w",stdout);
16     cin>>a>>b;
17     int j=1;
18     while (cin>>aa[j]>>bb[j]) j++;
19     j--;
20     int h=0,t=1;
21     q[1]=a;
22     k[a]=1;
23     int fl=30;
24     while (h<t){
25         string u=q[++h];
26         string l;
27         int d=tt[h];
28         if (u==b) {fl=tt[h];break;}
29         if (d>=10) {fl=0;break;}
30         int st=(u.length())-1;
31         for (int i=1;i<=j;++i){
32             int sr=aa[i].length();
33             int qq=u.find(aa[i],0);
34             if (qq==-1) continue;
35             for (int o=qq;o<=st-sr+1;++o){
36                 if (u.substr(o,sr)!=aa[i]) continue;
37                 l=u;
38                 l.replace(o,sr,bb[i]);
39                 if (l==b) {cout<<d+1;return 0;}
40                 if (!k[l]) q[++t]=l,tt[t]=d+1,k[l]=1;
41                 if (t>=30000) {cout<<"NO ANSWER!";return 0;}//先让我强行卡过最后一个点爽一下
42             }
43          }
44      }
45     if (!fl||fl==30) cout<<"NO ANSWER!";
46     else cout<<fl;
47     return 0;
48   }

后来想了一下这样还是不太好

去网上看了一下双向广搜 大概就是一种在知道初始并且也知道目标状态的情况下的优化型搜索

一般有两种方法 一种是直接交替着搜 但是这种似乎有点问题 好像是说如果要交替应该是一层一层地交替

另外一种是相对而言更优秀一点的 就是每次选两边中状态更少的那一队进行扩展 这样能使扩展的节点更少一点吧

具体实现大概就是把原来的bfs分为两端 然后好像还可以用^操作

我实在是太懒了所以没怎么想好好打就把上面那个乱玩的随便复制了一遍 勉勉强强最后一点还是拖过了(本来就只想着要过最后一个点23333

一定是stl太慢了才不是我垃圾呢哼(睁眼说瞎话

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<string>
 7 #include<map>
 8 using namespace std;
 9 string a,b,aa[8],bb[8];
10 string q[5000010],p[5000010];
11 int tt[2][5000010];
12 map <string,bool> k[2];
13 map <string,int> kk;
14 int main(){
15     freopen ("string.in","r",stdin);
16     freopen ("string.out","w",stdout);
17     cin>>a>>b;
18     int j=1;
19     while (cin>>aa[j]>>bb[j]) j++;
20     j--;
21     int h=0,t=1,hh=0,ttt=1;
22     q[1]=a;
23     p[1]=b;
24     k[0][a]=1;
25     k[1][b]=1;
26     int fl=30;
27     while (h<t&&hh<ttt){
28         if (t<=ttt){
29             string u=q[++h];
30             string l;
31             int d=tt[0][h];
32             if (d>=10) {fl=0;break;}
33             int st=(u.length())-1;
34             for (int i=1;i<=j;++i){
35                 int sr=aa[i].length();
36                 int qq=u.find(aa[i],0);
37                 if (qq==-1) continue;
38                 for (int o=qq;o<=st-sr+1;++o){
39                     if (u.substr(o,sr)!=aa[i]) continue;
40                     l=u;
41                     l.replace(o,sr,bb[i]);
42                     if (k[1][l]) {cout<<d+1+tt[1][kk[l]];return 0;
43                     }
44                     if (!k[0][l]) q[++t]=l,tt[0][t]=d+1,k[0][l]=1,kk[l]=t;
45             }
46          }
47         }
48         else{
49             string u=p[++hh];
50             string l;
51             int d=tt[1][hh];
52             if (d>=10) {fl=0;break;}
53             int st=(u.length())-1;
54             for (int i=1;i<=j;++i){
55                 int sr=bb[i].length();
56                 int qq=u.find(bb[i],0);
57                 if (qq==-1) continue;
58                 for (int o=qq;o<=st-sr+1;++o){
59                     if (u.substr(o,sr)!=bb[i]) continue;
60                     l=u;
61                     l.replace(o,sr,aa[i]);
62                     if (k[0][l]) {cout<<d+1+tt[0][kk[l]];return 0;}
63                     if (!k[1][l]) p[++ttt]=l,tt[1][ttt]=d+1,k[1][l]=1,kk[l]=ttt;
64                 }
65             }
66         }
67     }
68     if (!fl||fl==30) cout<<"NO ANSWER!";
69     else cout<<fl;
70     return 0;
71   }

 

以上是关于NOIP2002 字符变换的主要内容,如果未能解决你的问题,请参考以下文章

noip2002提高组题解

[NOIP2002]字串变换 T2 双向BFS

[NOIP2002] 提高组P1032 字串变换

[NOIP2002] 字串变换 宽搜+深度优化

noip提高组2002 字串变换(luogu P1032 )

NOIP2002pj产生数[floyd 高精度]