POJ 3087 Shuffle'm Up
这题是个模拟题啊!!!
题目大意:
已知两堆牌s1和s2的初始状态, 其牌数均为c,按给定规则能将他们相互交叉组合成一堆牌s12,再将s12的最底下的c块牌归为s1,最顶的c块牌归为s2,依此循环下去。给定输入s1和s2的初始状态 以及 预想的最终状态s12。
问s1 s2经过多少次洗牌之后,最终能达到状态s12,若永远不可能相同,则输出"-1"。
用Map都是0MS 数据得有多水啊!!
下面是代码:
#include <stdio.h> #include <map> #include <string.h> #include <string> using namespace std; int main() { int n,c,t=0,cut,i; scanf("%d",&n); while(n--) { scanf("%d",&c); t++; cut=0; char s1[110],s2[110],s12[220],s[220]; scanf("%s%s%s",s1,s2,s12); map <string,int > map1; int len,flat=0; while(1) { cut++; len=0; for(i=0;i<c;i++) { s[len]=s2[i]; len++; s[len]=s1[i]; len++; } s[len]='\0'; if(strcmp(s,s12)==0) { flat=1; break; } if(map1.find(s)!=map1.end()) { break; } map1[s]=0; for(i=0;i<c;i++) { s1[i]=s[i]; s2[i]=s[i+c]; } } if(flat) { printf("%d %d\n",t,cut); } else { printf("%d -1\n",t); } } return 0; }