前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C/C++】2024春晚刘谦春晚魔术步骤模拟+暴力破解

【C/C++】2024春晚刘谦春晚魔术步骤模拟+暴力破解

作者头像
命运之光
发布2024-03-20 14:24:16
1400
发布2024-03-20 14:24:16
举报
魔 术 步 骤

首先,准备4张扑克牌,跟随魔术步骤,来一起“见证奇迹”。

步骤 1
  • 将准备好的4张扑克牌
  • 平均撕成两份
  • 并叠在一起
步骤 2
  • 将牌堆顶数量为
  • 【名字字数】的牌
  • 移至牌堆底
步骤 3
  • 将前三张牌放在牌堆中间
  • 并取出牌堆顶的牌
  • 放置在一旁
步骤 4
  • 取出牌堆顶的若干张牌
  • 插入牌堆中间
  • 此处选择的牌数为
  • 南方人取1张,北方人取2张
  • 若不确定是南方人还是北方人取3张
步骤 5
  • 男生扔掉牌堆顶1张
  • 女生扔掉牌堆顶2张
步骤 6
  • 执行“见证奇迹的时刻”循环
  • 每说一个字
  • 就取出牌堆顶一张牌放置在牌堆底
步骤 7

👇执行如下操作👇

  • 从牌堆顶开始
  • 每次先将牌堆顶的一张牌放在牌堆底
  • 再扔掉牌堆顶的一张牌
  • 重复以上操作直到只剩一张牌
  • 检查此牌和放置在一旁的牌是否吻合
  • 若吻合,则魔术成功

按照上面的魔术步骤用C/C++进行模拟和暴力破解

代码如下
代码语言:javascript
复制
#include <iostream>
#include <vector>
#include <algorithm> 

using namespace std;

struct Card {
    int value; // 用数字代表扑克牌,简化处理
};

// 打印牌堆
void printDeck(const vector<Card>& deck) {
    for (auto& card : deck) {
        cout << card.value << " ";
    }
    cout << endl;
}

// 步骤 2: 根据给定的名字字数移动牌
void moveCardsForName(vector<Card>& deck, int nameLength) {
    rotate(deck.begin(), deck.begin() + nameLength, deck.end());
}

// 步骤 3: 取出牌堆顶的牌并放置在一旁
Card takeTopCard(vector<Card>& deck) {
    Card topCard = deck.front();
    deck.erase(deck.begin()); // 移除顶部牌
    return topCard;
}

// 步骤 4: 根据地域移动牌
void moveCardsByRegion(vector<Card>& deck, int cardsToMove) {
    // 假设“地域”只影响移动的牌数
    rotate(deck.begin(), deck.begin() + cardsToMove, deck.end());
}

// 步骤 5: 根据性别移除牌
void removeCardsByGender(vector<Card>& deck, char gender) {
    int removeCount = (gender == 'M') ? 1 : 2;
    deck.erase(deck.begin(), deck.begin() + removeCount);
}

// 步骤 6: 循环移动牌
void cycleCards(vector<Card>& deck, const string& phrase) {
    for (size_t i = 0; i < phrase.length(); ++i) {
        Card card = deck.front();
        deck.erase(deck.begin());
        deck.push_back(card); // 将顶部牌移动到底部
    }
}

// 步骤 7: 执行最终操作,直到只剩一张牌,然后比较
bool finalOperationAndCompare(vector<Card>& deck, const Card& asideCard) {
    while (deck.size() > 1) {
        cout << "弃牌之前手里卡牌为: ";
        printDeck(deck);

        deck.push_back(deck.front()); // 将顶部牌移动到底部
        cout << "将顶部卡牌移至底部: ";
        printDeck(deck);

        deck.erase(deck.begin()); // 移除现在的顶部牌(原第二张牌,刚才移动过的)
        cout << "取出新的卡牌: ";
        printDeck(deck);

        deck.erase(deck.begin()); // 再次移除顶部牌,对应扔掉的操作
        cout << "移除下一张顶牌(弃牌): ";
        printDeck(deck);
    }

    cout << "最后一张牌为: " << deck.front().value << endl;
    cout << "之前步骤3,藏在屁股后面的卡牌为: " << asideCard.value << endl;

    return deck.front().value == asideCard.value;
}

int main() {
    // 初始化牌堆,每张牌各有两张
    vector<Card> deck = { {1}, {2}, {3}, {4}, {1}, {2}, {3}, {4} };

    cout << "初始卡牌: ";
    printDeck(deck);

    // 模拟魔术步骤
    moveCardsForName(deck, 3); // 假设名字长度为3
    cout << "移动卡牌后的名称: ";
    printDeck(deck);

    Card asideCard = takeTopCard(deck); // 执行步骤3并记下牌堆顶的牌
    cout << "抽取第一张卡牌藏在屁股后面: ";
    printDeck(deck);
    cout << "藏起来的卡牌是: " << asideCard.value << endl;

    moveCardsByRegion(deck, 2); // 假设是北方人
    cout << "执行步骤4,判断南北方人: ";
    printDeck(deck);

    removeCardsByGender(deck, 'M'); // 假设是男性
    cout << "执行步骤5,按性别删除卡牌: ";
    printDeck(deck);

    cycleCards(deck, "见证奇迹的时刻"); // 循环移动牌
    cout << "执行步骤6,循环移动卡牌后: ";
    printDeck(deck);

    cout << "执行步骤7,从牌堆顶开始,每次先将牌堆顶的一张牌放在牌堆底,再扔掉牌堆顶的一张牌,重复以上操作直到只剩一张牌" << endl;
    // 执行最终操作并比较
    bool isMagicSuccessful = finalOperationAndCompare(deck, asideCard);
    if (isMagicSuccessful) {
        cout << "魔术成功!最后一张牌与预留的牌相符。" << endl;
    }
    else {
        cout << "魔术失败!最后一张牌与预留的牌不符。" << endl;
    }
    
    return 0;
}
运行结果

模拟运行结果如下:

初始卡牌: 1 2 3 4 1 2 3 4 移动卡牌后的名称: 4 1 2 3 4 1 2 3 抽取第一张卡牌藏在屁股后面: 1 2 3 4 1 2 3 藏起来的卡牌是: 4 执行步骤4,判断南北方人: 3 4 1 2 3 1 2 执行步骤5,按性别删除卡牌: 4 1 2 3 1 2 执行步骤6,循环移动卡牌后: 2 3 1 2 4 1 执行步骤7,从牌堆顶开始,每次先将牌堆顶的一张牌放在牌堆底,再扔掉牌堆顶的一张牌,重复以上操作直到只剩一张牌 弃牌之前手里卡牌为: 2 3 1 2 4 1 将顶部卡牌移至底部: 2 3 1 2 4 1 2 取出新的卡牌: 3 1 2 4 1 2 移除下一张顶牌(弃牌): 1 2 4 1 2 弃牌之前手里卡牌为: 1 2 4 1 2 将顶部卡牌移至底部: 1 2 4 1 2 1 取出新的卡牌: 2 4 1 2 1 移除下一张顶牌(弃牌): 4 1 2 1 弃牌之前手里卡牌为: 4 1 2 1 将顶部卡牌移至底部: 4 1 2 1 4 取出新的卡牌: 1 2 1 4 移除下一张顶牌(弃牌): 2 1 4 弃牌之前手里卡牌为: 2 1 4 将顶部卡牌移至底部: 2 1 4 2 取出新的卡牌: 1 4 2 移除下一张顶牌(弃牌): 4 2 弃牌之前手里卡牌为: 4 2 将顶部卡牌移至底部: 4 2 4 取出新的卡牌: 2 4 移除下一张顶牌(弃牌): 4 最后一张牌为: 4 之前步骤3,藏在屁股后面的卡牌为: 4 魔术成功!最后一张牌与预留的牌相符。

结语

❤表演结束,你的牌对上了吗?(●'◡'●)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 魔 术 步 骤
    • 步骤 1
      • 步骤 2
        • 步骤 3
          • 步骤 4
            • 步骤 5
              • 步骤 6
                • 步骤 7
                • 代码如下
                • 运行结果
                • 结语
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档