【洗牌魔术_magic】

洗牌魔术 magic

描述

题目背景

小张同学自从看了春晚的扑克魔术之后,就迷上了。自己琢磨了一个魔术。把一副牌按照某种洗牌手法处理之后,翻开每一张已经有序了。

比如,3 2 4 1分别代表4张牌。把最后一张牌放到最上面,再把倒数第二个牌放到第二个位置。就变成了1 2 3 4。

小张的魔术秘密是什么呢?其实很简单,最初的牌看似随意,其实是设计好的,只要按照自己记忆好的洗牌方式,最后一定会变成有序的。

小张在寒假苦练10天,终于有所小成,到了学校之后给朋友展示,谁知道朋友要先洗洗牌,小张蒙了,但没办法,硬着头皮故作轻松说,可以。

小张这时候没有办法了,还是按照之前记忆好的洗牌方式处理,比如在上面的例子,把最后一张牌放到最上面,再把倒数第二个牌放到第二个位置。

这样做,肯定是不行的哇。但小张为了拖延时间,疯狂的调换。按照记忆好的洗牌方式,处理了k遍。请你计算出,洗了k次之后的牌,是什么顺序。

输入格式:

输出有四行,
第一行为小张实现设计好的扑克牌顺序。
第二行是小张按照记忆好的洗牌方式,处理过的顺序
第三行是,小张同学洗牌之后的顺序。
第四行是小张洗牌k遍。

前三行均为小写字母,长度相同,每个字母只会出现一次.

k的范围是100以内

输出格式:

输出一行字符串,代表小张洗牌k遍之后的顺序

数据范围:

字符串长度为2到26

1≤k≤100

样例解释

样例1解释:我们把初始字符串称为s1,经过一次洗牌之后的字符串称为s2.
可以发现,s1的最后一位变成s2的第一位,s1的第一位,变成s2的第二位,s1的第二位变成s2的最后一位。

所以cba这个字符串经过一次洗牌之后,就变成了acb

样例2解释:
经过一次洗牌之后,变成了abdc,经过两次洗牌之后变成了bdca。

用例输入 1
abc
cab
cba
1
用例输出 1
acb

用例输入 2

abcd
bcda
cabd
2

用例输出 2

bdca

思路

先写一个shuffle函数,用于洗牌。
shuffle函数:
可以看出,字符串s1和s2是洗牌规律的关键。
先创建一个空字符串。
如果s1[i] == s2[j]s3[i] = result[j]
然后,for循环 k k k次,每次用洗过的牌代替原先的牌。
不要忘了,本题需用freopen(但我这里注释了,你要注意)!

代码

#include <bits/stdc++.h>

using namespace std;

string shuffle(string s1, string s2, string s3) {
    int len = s1.length();
    char* result = new char[len + 1];
    result[len] = '\0';
    for (int i = 0; i <= len; i++) {
        for (int j = 0; j < len; j++) {
            if (s2[j] == s1[i]) {
                result[j] = s3[i];
                break;
            }
        }
    }
    return result;
}

int main() {
    
//  freopen("magic.in","r",stdin);
//  freopen("magic.out","w",stdout);
    string s1, s2, s3;
    cin >> s1 >> s2 >> s3;
    int k;
    cin >> k;
    string result = s3;
    for (int i = 0; i < k; i++) {
        result = shuffle(s1, s2, result);
    }
    cout << result << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值