一个知识性题目,介绍了一个L系统,L系统有个递归变换规则,就是可以把其中所有的字母,按照规则替换成对应的字符串,具体的可以维基一下。
这题是给了两个规则,要求两种规则同时作用,问能不能能个创造一个字符串包含目标串,主要要注意的就是如果初始串就包含目标串,则要截取判断,和对于状态长度的最大限度。
只要搞清楚了规则,那么直接bfs即可
/* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please indicate the source** */ #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <queue> #include <map> #define INF 1E9 using namespace std; char A[20],B[20],w[20]; int la,lw; string aim,now,temp; map<string,int> vis; queue<string> q; bool flag; void change(string s) { int i,len=s.size(); now=""; for(i=0;i<len;i++) { switch(s[i]) { case 'a':now+=A;break; case 'b':now+=B;break; } } if(now.size()<=la) { if(vis[now])return; if(aim==now)flag=0; vis[now]=1;q.push(now); } else//超出长度,截取 { len=now.size()-la; for(i=0;i<=len;i++) { temp=now.substr(i,la); if(vis[temp])continue; if(temp==aim)flag=0; vis[temp]=1;q.push(temp); } } return; } int main() { int i,j; char t; while(~scanf("%s%s%s",A,B,w)) { flag=1; cin>>aim; la=aim.size();lw=strlen(w); vis.clear(); while(!q.empty())q.pop(); for(i=0;i<lw&&flag;i++)//截取原字符串 for(j=i+1;j<=lw&&flag;j++) { t=w[j]; w[j]='\0'; temp=string(w+i); w[j]=t; if(vis[temp])continue; if(temp==aim)flag=0; vis[temp]=1; q.push(temp); } while(!q.empty()&&flag) { change(q.front()); q.pop(); } printf("%s\n",flag?"NO":"YES"); } }