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后面要加‘’,我就是没有注意这个问题结果贡献了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]='';
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
",cas,counts);
40        else printf("%d -1
",cas);
41      }
42 }
View Code
原文地址:https://www.cnblogs.com/chujian123/p/3536827.html