题目链接: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 }