题目:https://www.luogu.org/problemnew/show/P1032
字符串好复杂...先写了个 dfs ,RE一个点TLE一个点,不知该怎么改了...

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; char a[205],b[205],c[10][205],d[10][205]; int n,ans=20,inf=20; bool ck(char x[],int l1,int i,int j) { int l2=strlen(c[j]); if(l1-i<l2)return 0; for(int t=0;t<l2&&i+t<l1;t++) if(x[i+t]!=c[j][t])return 0; return 1; } bool cmp(char x[],int l1) { // int l1=x.length(),l2=b.length(); int l2=strlen(b); if(l1!=l2)return 0; for(int i=0;i<l1;i++)if(x[i]!=b[i])return 0; return 1; } void print(char x[],int l) { printf("%d ",l); for(int i=0;i<l;i++)printf("%c",x[i]); printf(" "); } void dfs(char x[],int s,int l) { if(cmp(x,l)){ans=min(ans,s); return;} if(s>=10)return; char nxt[205]; for(int i=0;i<l;i++) { for(int j=1;j<n;j++) if(ck(x,l,i,j)) { cout<<j<<endl; int l1=strlen(c[j]),l2=strlen(d[j]),ln=0; for(int k=0;k<i;k++)nxt[ln++]=x[k]; for(int k=0;k<l2;k++)nxt[ln++]=d[j][k]; for(int k=i+l1;k<l;k++)nxt[ln++]=x[k]; dfs(nxt,s+1,ln); } } } int main() { cin>>a; cin>>b; n=1; while(cin>>c[n]>>d[n])n++; // while(~scanf("%s",&t)) // c[++n]=t,scanf("%s",&d[n]); dfs(a,0,strlen(a)); if(ans==inf)printf("NO ANSWER!"); else printf("%d ",ans); return 0; }
看到大家都是 bfs,确实找最小步数的话应该是 bfs 呢;
用了好多 STL,学到了...
思路没什么,就是不太好写,使用 STL 感觉很方便。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<map> using namespace std; int n; string a,b,c[10],d[10]; map<string,int>mp; queue<pair<string,int> >q; int main() { cin>>a>>b; while(cin>>c[++n])cin>>d[n]; n--; mp[a]=0; q.push(make_pair(a,0)); while(q.size()) { string s=q.front().first; int t=q.front().second; q.pop(); int l=s.length(); if(t>10)break; for(int i=1;i<=n;i++) { int l2=c[i].length(); for(int j=0;j<=l-l2;j++) { if(s.substr(j,l2)!=c[i])continue; string ns; ns.clear();// if(j)ns+=s.substr(0,j);//(起点,起点开始的长度) ns+=d[i]; if(j+l2<l)ns+=s.substr(j+l2,l-j-l2+1); if(ns==b){printf("%d ",t+1); return 0;} if(mp.find(ns)==mp.end()) { mp[ns]=t+1; q.push(make_pair(ns,t+1)); } } } } printf("NO ANSWER!"); return 0; }