POJ 3087 Shuffle'm Up(简单模拟)

Description
给定长度都为C两个字符串S1,S2,和一个要求的结果字符串SS。先把S2的最下面一张牌放在最下面,然后S1,S2交错的叠放,得到S,再把S最下面的C个字符赋值给S1,把剩下的赋值给S2,再次重复上面的过程。最后求出要得到SS,需要几步这样的过程
Input
多组用例,第一行为用例组数test,每组用例第一行为S1,S2长度,之后三行分别输入S1,S2,SS
Output
对于每组用例,输出该过程步数,如果不能到达目的则输出-1
Sample Input
2
4
AHAH
HAHA
HHAAAAHH
3
CDE
CDE
EEDDCC
Sample Output
1 2
2 -1
Solution
简单模拟,如果在操作几次之后出现前面已经出现过的状态则陷入循环显然不可能到达目标状态,输出-1
Code

#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<map>
using namespace std;
int main()  
{  
    int test,c,i,k;  
    int t=0;  
    cin>>test;  
    while(++t<=test)  
    {  
        cin>>c;  
        char s1[201];  
        char s2[201];   
        char s12[401]; 
        cin>>s1>>s2>>s12;    
        map<string,bool>vist;//记录某状态是否出现过    
        vist[s12]=true;
        int step=0;//初始化步数    
        while(true)  
        {  
            char s[201];    
            int ps=0;    
            for(i=0;i<c;i++)//叠放   
            {  
                s[ps++]=s2[i];  
                s[ps++]=s1[i];  
            }  
            s[ps]='\0';//注意'\0'   
            step++;//步数加一              
            if(!strcmp(s,s12))//达到目的状态   
            {  
                cout<<t<<' '<<step<<endl;  
                break;  
            }  
            else if(vist[s]&&strcmp(s,s12))//出现循环而且没有达到目的状态  
            {                                  
                cout<<t<<' '<<-1<<endl;  
                break;  
            }   
            vist[s]=true;//将该状态记录 
            for(i=0;i<c;i++)//取出下半段复制给s1 
                s1[i]=s[i];  
            s1[i]='\0';  
            for(k=0;i<2*c;i++,k++)//取出上半段复制给s2  
                s2[k]=s[i];  
            s2[i]='\0';  
        }  
    }  
    return 0;  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值