首页 > 代码库 > NOIP2002 字符变换
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 字符变换
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。