题意:意思就是,s1,和s2两堆牌,然后先s2一张再s1,最后会出现一个s12序列,例如s1 AHAH
S2 HAHA 然后s12为HAAHHAAH,然后前面一部分给s1,后面一部分给s2,然后再重复操作。最后看能否达到目标序列。
思路:大牛的做法是经过了一些操作后看s1是否等于刚开始输入的序列,若等于,则不能达到。
然后这个代码要注意的一点是初始化,,,如果s12不初始化的话,很有可能会WA;
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 #define N 1005 6 7 char s1[N],s2[N],temp[N],d[N],mark[N];//d装目的字符组,temp装临时字符组,mark装标记字符组 8 int t,c,num,ans;//num为答案序号 9 10 void test() 11 { 12 printf("s1[%s]s2[%s]d[%s]mark[%s]temp[%s] ",s1,s2,d,mark,temp); 13 getchar(); 14 } 15 16 void solve() 17 { 18 int i,j; 19 20 ans=0; 21 strcpy(mark,s1); 22 memset(temp,0,sizeof(temp)); 23 while (strcmp(temp,d)!=0)//一次洗牌 24 { 25 for (i=0,j=0;i<2*c;i+=2,j++)//注意条件是i<2*c!!! 26 { 27 temp[i]=s2[j]; 28 temp[i+1]=s1[j]; 29 } 30 // test(); 31 ans++; 32 memset(s1,0,sizeof(s1)); 33 memset(s2,0,sizeof(s2)); 34 for (i=0;i<c;i++) 35 { 36 s1[i]=temp[i]; 37 } 38 for (j=0;i<2*c;i++,j++) 39 { 40 s2[j]=temp[i]; 41 } 42 if (strcmp(s1,mark)==0)//判断是否循环 43 { 44 printf("%d -1 ",num++); 45 return; 46 } 47 if (strcmp(temp,d)==0) 48 { 49 printf("%d %d ",num++,ans); 50 return; 51 } 52 } 53 } 54 55 int main() 56 { 57 scanf("%d",&t); 58 num=1; 59 while (t--) 60 { 61 scanf("%d",&c); 62 getchar(); 63 scanf("%s",s1); 64 getchar(); 65 scanf("%s",s2); 66 getchar(); 67 scanf("%s",d); 68 solve(); 69 } 70 71 return 0; 72 }