G - Shuffle'm Up[模拟+bfs]

本文介绍了一个名为G-Shuffle'mUp的问题,该问题涉及通过特定规则将两个输入序列合并成一个目标序列。文章详细解释了如何通过模拟的方式解决这个问题,并通过循环检测来判断是否能够成功达到目标序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

G - Shuffle’m Up

大致题意为:给你两个序列s1, s2, 给你一个要求的最终序列s3
将s2的最后一张牌放牌底,然后s1最后一张,s2,s1 直至全部放完形成最后序列
然后如果能达到最后序列的成果,就打印合成次数
不能就打印-1。

脑洞:先想到怎么判断不能。那就是出现循环的时候,因为两个给定的序列,会合成唯一一个合成序列,而一个已知的合成序列,就能分成两个确定的序列,所以如果不能,就一定会出现循环,毕竟排列组合种类是有限的。

然后就是模拟了。然后 算搜索嘛?

string s1,s2,s12,vis_s,s_tgt;//s1, s2, s12, 标记s查循环, 目标序列
int N, c, step;

void Init(){
    s1 = "";s2 = ""; s12 = ""; vis_s = "";s_tgt = "";
    c = 0;step = 0;
}
	int main(){
    cin >> N;
    for (int i=1; i<=N; i++){
        Init();
        cin >> c;
        cin >> s1 >> s2 >> s_tgt;
        bfs(i);
    }
    return 0;
}

void bfs(int pos){
    while (1) {
        s12 = "";
        for (int i=0; i<c; i++){//合体
            s12 = s12 + s2[i];
            s12 = s12 + s1[i];
        }
        
        if (step == 0) vis_s = s12;//把第一次合成的序列当作标记序列
        
        step ++;
        
        if (s12 == s_tgt) {
            cout << pos << " " << step << endl;
            break;
            
        }
        //分开
        s1 = "" ; s2 = "";
        for (int i=0; i<c; i++) s1 = s1 + s12[i];
        for (int i=c; i<c*2; i++) s2 = s2 + s12[i];
        
        if (step == 1) continue;
        
        if (vis_s == s12){
            cout << pos << " " << "-1" << endl;
            break;
        }
        
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值