poj 3087 直接模拟

题意:意思就是,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 } 
原文地址:https://www.cnblogs.com/hemeiwolong/p/9324505.html