题目链接:http://poj.org/problem?id=3087

 

Sample Input

2
4
AHAH
HAHA
HHAAAAHH
3
CDE
CDE
EEDDCC
Sample Output

1 2
2 -1

 

分析:

是一个洗牌游戏,首先给出两堆牌,s1,s2,先从s1上面拿一张牌再从s2上面拿一张牌依次往下可以洗好牌,然后把洗好的牌再分成两堆继续洗,直到这堆牌的顺序与给的顺序相同可以停止,当然如果洗不出给出来的顺序也可以停止
 
看这题首先没有什么特别好的想法,先暴力一下试试吧。。。然后,其实就是一个模拟题
 
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<queue>
 5 #include<algorithm>
 6 #include<time.h>
 7 using namespace std;
 8 
 9 const int maxn = 2005;
10 const int N=1207;
11 
12 char a[N],e[N],s1[N],s2[N],s[N];
13 
14 int Find(char s1[],char s2[],char s[],int n,int k)
15 {
16     int j=0,i;
17     for(i=0;i<n;i++)
18     {
19         a[j++]=s2[i];
20         a[j++]=s1[i];
21     }
22     if(strcmp(a,s)==0)
23         return k;
24 
25     if(k==1)
26         strcpy(e,a);
27     if(k != 1&&strcmp(e,a)==0)
28         return -1;
29 
30     strncpy(s1,a,n);
31     strncpy(s2,a+n,n);
32 
33     return Find(s1,s2,s,n,k+1);
34 }
35 
36 int main()
37 {
38     int T,t,n;
39 
40     scanf("%d", &T);
41     t=1;
42 
43     while(T--)
44     {
45 
46 
47         scanf("%d %s %s %s", &n,s1,s2,s);
48 
49         memset(a,0,sizeof(a));
50 
51         int ans=Find(s1,s2,s,n,1);
52 
53         printf("%d %d\n",t++,ans);
54     }
55 
56     return 0;
57 }

 

 
posted on 2016-07-27 11:02  惟愿。。。  阅读(211)  评论(0编辑  收藏  举报