本文主要是介绍POJ 3087_Shuffle'm UP,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目意思:
给两堆扑克牌,分别记为S1 和 S2,两堆的数量是相等的都为C。定义你的一次操作是将两副牌分别叉开来放。任何一次都是S2底下的先放。至此,S1 的顶牌即为新
堆S12的顶。然后将新的S12 底部分给S1,上面发给S2。问能否在有限次操作后 达到目标串。若有,输出步数,否则输出-1,表示无解。
题目测试数据与数据范围:
2 4 AHAH HAHA HHAAAAHH 3 CDE CDE EEDDCC
1 2 2 -1其中1<=C<=100. 1<=N<=1000
AHAH HAHA -> HAAHHAAH ->(HAAH HAAH)->HHAAAAHH 两步即可。
样例二无解。
题目分析:
首先,给我的第一感觉是模拟题。那么我们可以想如果在有限的步数里面,达不到我们的目标解,我们就会输出无解。那么在模拟的过程
中,定义两个输入字串S1[110],S2[110],分别用于输入与重新分堆,定义一个目标串strsum[220].和一个用来分步模拟的临时串,
strtmp[220]; 每一次按S2 到 S1 的顺序复制到 strtmp 里头,如果相等,则可以跳出(给定最大有限次数(我定义为10010)循环)输出解
否则将strtmp 分成两堆,重复工作。如果一直没有达到目标串,循环正常结束无解。
小乐一下:当我们在做模拟题 的时候,我们不知道明显无解的情况,或者某些限定的次数,我们最好的办法是可以猜一个,在不超过
最大时间复杂度。还有做题的过程中应先出思路,先定义好自己的代码结构,然后即可随手拈来AC。
题目链接: 点击打开链接
代码仅限参考,由你写出更好更简洁的代码,不能直接复制。
#include<stdio.h>
#include<string.h>
char str1[1010],str2[1010],strsum[2020],strtmp[2020];int main(){int T;int n;int i,j;int cnt = 1;scanf("%d",&T);while(T--){scanf("%d",&n);scanf("%s%s%s",str1,str2,strsum);int times = 0;while(times <10010){j = 0;for(i = 0;i<n;i++){strtmp[j++] = str2[i];strtmp[j++] = str1[i];}strtmp[j] = '\0';times++;if(strcmp(strsum,strtmp)==0) {printf("%d %d\n",cnt++,times);break;}j = 0;for(i = 0;i<n;i++) str1[i] = strtmp[j++];str1[i]='\0';j = n;for(i = 0;i<n;i++) str2[i] = strtmp[j++];str2[i]='\0';}if(times>=10010) {printf("%d ",cnt++);printf("-1\n");}}return 0;
}
伟大的梦想成就伟大的人,从细节做好,从点点滴滴做好,认真做好。
这篇关于POJ 3087_Shuffle'm UP的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!