题目链接:http://poj.org/problem?id=3087
模拟题,用set判断是否出现重复,如重复则输出-1(因为会一直循环,达不到最终结果)。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<string> 5 #include<set> 6 using namespace std; 7 char s1[5000],s2[5000],s3[5000],s[5000]; 8 int l,st; 9 set<char *> sett; 10 void Shuff(char* s1,char* s2) 11 { 12 st++; 13 for(int i=0;i<l;i++) 14 { 15 s[2*i] =s2[i]; 16 s[2*i+1]=s1[i]; 17 } 18 s[2*l]='\0'; 19 for(int i=0;i<l;i++) 20 s1[i]=s[i]; 21 for(int i=0;i<l;i++) 22 s2[i]=s[i+l]; 23 24 if(strcmp(s,s3)==0) return ; 25 else if(!sett.count(s)) { sett.insert(s); Shuff(s1,s2);} 26 else {st=-1; return ;} 27 } 28 29 int main() 30 { 31 int t; 32 scanf("%d",&t); 33 for(int i=1;i<=t;i++) 34 { 35 sett.clear(); 36 st=0; 37 cin>>l; 38 cin>>s1>>s2>>s3; 39 Shuff(s1,s2); 40 cout<<i<<' '<<st<<endl; 41 } 42 return 0; 43 }
用string写了一遍,和上面差不多。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<string> 5 #include<set> 6 using namespace std; 7 string s1,s2,s3,s; 8 int l,st; 9 set<string> sett; 10 void dfs(string s1,string s2) 11 { 12 st++; 13 s=""; 14 for(int i=0;i<l;i++) 15 { 16 s+=s2[i]; 17 s+=s1[i]; 18 } 19 for(int i=0;i<l;i++) 20 s1[i]=s[i]; 21 for(int i=0;i<l;i++) 22 s2[i]=s[i+l]; 23 24 if(s==s3) return ; 25 else if(!sett.count(s)) { sett.insert(s); dfs(s1,s2);} 26 else {st=-1; return ;} 27 } 28 29 int main() 30 { 31 int t; 32 scanf("%d",&t); 33 for(int i=1;i<=t;i++) 34 { 35 sett.clear(); 36 st=0; 37 cin>>l; 38 cin>>s1>>s2>>s3; 39 dfs(s1,s2); 40 cout<<i<<' '<<st<<endl; 41 42 } 43 return 0; 44 }