啊本来以为2002的题应该会比较友善于是很naive地像模拟一样用着stl乱玩结果死也过不了最后一个点qaq
心情很悲痛于是为了解放自我
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<string> #include<map> using namespace std; ],bb[]; ]; ]; map <string,bool> k; int main(){ // freopen ("string.in","r",stdin); // freopen ("string.out","w",stdout); cin>>a>>b; ; while (cin>>aa[j]>>bb[j]) j++; j--; ,t=; q[]=a; k[a]=; ; while (h<t){ string u=q[++h]; string l; int d=tt[h]; if (u==b) {fl=tt[h];break;} ) {fl=;break;} ; ;i<=j;++i){ int sr=aa[i].length(); ); ) continue; ;++o){ if (u.substr(o,sr)!=aa[i]) continue; l=u; l.replace(o,sr,bb[i]); ;;} ,k[l]=; ) {cout<<;}//先让我强行卡过最后一个点爽一下 } } } ) cout<<"NO ANSWER!"; else cout<<fl; ; }
后来想了一下这样还是不太好
去网上看了一下双向广搜 大概就是一种在知道初始并且也知道目标状态的情况下的优化型搜索
一般有两种方法 一种是直接交替着搜 但是这种似乎有点问题 好像是说如果要交替应该是一层一层地交替
另外一种是相对而言更优秀一点的 就是每次选两边中状态更少的那一队进行扩展 这样能使扩展的节点更少一点吧
具体实现大概就是把原来的bfs分为两端 然后好像还可以用^操作
我实在是太懒了所以没怎么想好好打就把上面那个乱玩的随便复制了一遍 勉勉强强最后一点还是拖过了(本来就只想着要过最后一个点23333
一定是stl太慢了才不是我垃圾呢哼(睁眼说瞎话
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<string> #include<map> using namespace std; ],bb[]; ],p[]; ][]; map <]; map <string,int> kk; int main(){ freopen ("string.in","r",stdin); freopen ("string.out","w",stdout); cin>>a>>b; ; while (cin>>aa[j]>>bb[j]) j++; j--; ,t=,hh=,ttt=; q[]=a; p[]=b; k[][a]=; k[][b]=; ; while (h<t&&hh<ttt){ if (t<=ttt){ string u=q[++h]; string l; ][h]; ) {fl=;break;} ; ;i<=j;++i){ int sr=aa[i].length(); ); ) continue; ;++o){ if (u.substr(o,sr)!=aa[i]) continue; l=u; l.replace(o,sr,bb[i]); ][l]) {cout<<d++tt[][kk[l]];; } ][l]) q[++t]=l,tt[][t]=d+,k[][l]=,kk[l]=t; } } } else{ string u=p[++hh]; string l; ][hh]; ) {fl=;break;} ; ;i<=j;++i){ int sr=bb[i].length(); ); ) continue; ;++o){ if (u.substr(o,sr)!=bb[i]) continue; l=u; l.replace(o,sr,aa[i]); ][l]) {cout<<d++tt[][kk[l]];;} ][l]) p[++ttt]=l,tt[][ttt]=d+,k[][l]=,kk[l]=ttt; } } } } ) cout<<"NO ANSWER!"; else cout<<fl; ; }