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;
}

伟大的梦想成就伟大的人,从细节做好,从点点滴滴做好,认真做好。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值