Shuffle'm Up
poj3087:http://poj.org/problem?id=3087
题意:题意简化之后的就是:给你两个长度均为c的字符串s1,s2,然后给你一个2*c的串ss,现在每次从s2,中取一个,然后再从s1,取出一个(都是从左往右),组成新的串,如果新的的串和ss相同,则说明s1,s2可以通过若干次洗牌,组成ss。现在就是来求这个步数,若存在,则输出,否则输出-1.
题解:直接模拟。但是要注意一个问题。就是strcmp(s1,s2)s1,s2后面要加‘\0’,我就是没有注意这个问题结果贡献了4wa。
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #include<map> 6 #include<string> 7 using namespace std; 8 char s1[102],s2[102],aim[202],temp[202]; 9 int c; 10 int main(){ 11 int t; 12 scanf("%d",&t); 13 for(int cas=1;cas<=t;cas++){ 14 map<string,int>Q; 15 scanf("%d",&c); 16 scanf("%s",s1); 17 scanf("%s",s2); 18 scanf("%s",aim); 19 int counts=0; 20 Q[aim]=1;bool flag=true; 21 while(true){ 22 for(int i=0;i<=2*c-1;i+=2) 23 temp[i]=s2[i/2]; 24 for(int i=1;i<=2*c-1;i+=2) 25 temp[i]=s1[i/2]; 26 counts++; 27 temp[2*c]='\0'; 28 if(strcmp(temp,aim)==0)break; 29 if(Q[temp]){ 30 flag=false; 31 break; 32 } 33 Q[temp]=1; 34 for(int i=0;i<c;i++) 35 s1[i]=temp[i]; 36 for(int j=c;j<=2*c-1;j++) 37 s2[j-c]=temp[j]; 38 } 39 if(flag)printf("%d %d\n",cas,counts); 40 else printf("%d -1\n",cas); 41 } 42 }