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

news2024/11/28 18:56:49

 

        在这个特别的除夕夜,我们不仅享受了与家人的温馨团聚,还被电视机前的春节联欢晚会深深吸引。特别是,魔术师刘谦的精彩表演,为我们带来了一场视觉和心灵的盛宴。在我的博客“【C/C++】2024春晚刘谦春晚魔术步骤模拟+暴力破解”中,我将带领大家一探究竟,用编程的角度去解析刘谦的扑克牌魔术。

        刘谦的魔术不仅仅是技巧的展示,更是智慧和创意的结晶。他的表演激发了我们的好奇心,让无数观众纷纷拿起家中的扑克牌,尝试跟随他的步伐,去“见证奇迹”。在这篇博客中,我们将使用C/C++语言,尝试模拟魔术的每一个步骤,并探索可能的破解方法。通过编程的途径,我们不仅能深入理解魔术背后的逻辑,也能增强我们解决问题的能力。

        无论你是编程爱好者,还是魔术的忠实粉丝,我相信这篇博客都能为你带来全新的视角和体验。让我们一起揭开刘谦魔术的神秘面纱,探索那些看似不可能,却被巧妙设计和精湛技艺变为可能的奇迹吧。

目录

魔 术 步 骤 

步骤 1

步骤 2

步骤 3

步骤 4

步骤 5

步骤 6

步骤 7

代码如下

运行结果

结语


魔 术 步 骤 

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

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

👇执行如下操作👇

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

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

代码如下

#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
魔术成功!最后一张牌与预留的牌相符。


结语

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

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1448229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCV基础:用Python生成一幅随机的噪声图像

使用Python&#xff1a;生成一幅随机数值的灰度图像&#xff0c;图像大小为1616像素。借助OpenCV库。输出数值&#xff0c;并显示图像。 # -*- coding: utf-8 -*- """ Created on Wed Feb 14 21:49:09 2024author: 李立宗公众号&#xff1a;计算机视觉之光知识…

证明之毕达哥拉斯定理

毕达哥拉斯定理 毕达哥拉斯的著名定理所讲的是&#xff0c;假设一直角三角形的三边长为a、b和c&#xff0c;其中c是斜边长&#xff08;直角所对的边&#xff09;&#xff0c;则 a 2 b 2 c 2 a^2b^2c^2 a2b2c2。这个定理有若干种证明&#xff0c;其中有一种特别简短&#xf…

【黑马程序员】C++封装、对象特性、友元

文章目录 类和对象封装封装的意义struct和class的区别成员属性设置为私有封装练习设计立方体类点和圆的关系 对象的初始化和清理构造函数和析构函数构造函数析构函数 构造函数的分类及调用拷贝构造函数的调用时机构造函数调用规则深拷贝与浅拷贝浅拷贝深拷贝 初始化列表类对象作…

matplotlib雷达图制作具体步骤

此次我们制作的是关于护肤品下的畅销品类雷达图&#xff0c;数据如下&#xff1a; 数据预览&#xff1a; 一、代码展示 import pandas as pd import numpy as np import matplotlib.pyplot as plt plt.rcParams[font.sans-serif][SimHei] adress"D:/pandas练习文件/雷达…

JAVA设计模式之解释器模式详解

解释器模式 1 解释器模式介绍 解释器模式使用频率不算高&#xff0c;通常用来描述如何构建一个简单“语言”的语法解释器。它只在一些非常特定的领域被用到&#xff0c;比如编译器、规则引擎、正则表达式、SQL 解析等。不过&#xff0c;了解它的实现原理同样很重要&#xff0…

零基础学编程怎么入手,中文编程工具构件箱之星空构件用法教程,系统化的编程视频教程上线

零基础学编程怎么入手&#xff0c;中文编程工具构件箱之星空构件用法教程&#xff0c;系统化的编程视频教程上线 一、前言 今天给大家分享的中文编程开发语言工具资料如下&#xff1a; 编程入门视频教程链接 http://​ https://edu.csdn.net/course/detail/39036 ​ 编程…

Java17之使用Lambda表达式对对象集合中指定的字段进行排序

Java17之使用Lambda表达式对对象集合中指定的字段进行排序 文章目录 Java17之使用Lambda表达式对对象集合中指定的字段进行排序1. 集合对象排序1. Java实体类2. 正序排序3.倒序排序 1. 集合对象排序 Java8起可用 List 的 sort 方法进行排序&#xff0c;形参为函数式接口Compara…

C++ //练习 6.12 改写6.2.1节中练习6.10(第188页)的程序,使用引用而非指针交换两个整数的值。你觉得哪种方法更易于使用呢?为什么?

C Primer&#xff08;第5版&#xff09; 练习 6.12 练习 6.12 改写6.2.1节中练习6.10&#xff08;第188页&#xff09;的程序&#xff0c;使用引用而非指针交换两个整数的值。你觉得哪种方法更易于使用呢&#xff1f;为什么&#xff1f; 环境&#xff1a;Linux Ubuntu&#x…

Docker关于conda环境的导出和导入

Docker关于conda环境的导出和导入 1、常用命令&#xff1a;2、环境导出&#xff1a;3、两个服务器之间的文件传输命令&#xff1a;4、环境导入&#xff1a;5、快速进入容器6、其他问题解决记录&#xff1a; 1、常用命令&#xff1a; docker pull -- 从远程仓库将镜像下载至本地…

医疗相关名词,医疗名词整理

1.系统类&#xff1a; HIS Hospital Information System&#xff0c;医院信息系统&#xff0c;在国际学术界已公认为新兴的医学信息学(Medical Informatics)的重要分支。美国该领域的著名教授Morris.Collen于1988年曾著文为医院信息系统下了如下定义&#xff1a;利用电子计算…

[Linux开发工具]项目自动化构建工具-make/Makefile

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.背景2.依赖关系和依…

error An unexpected error occurred: “https://registry.npm.taobao.org

背景&#xff1a; 想使用yarn命令结果报错 问题原因&#xff1a; 原来证书到期了 http://registry.npm.taobao.org/ 把这个放到浏览器搜索的时候自动换成https://registry.npmmirror.com/ 方案&#xff1a; npm cache clean --forcenpm config set registry https://registry…

Windows 虚拟桌面信息(一)分析注册表

目录 前言 一、理论分析 二、代码实现 总结 本文为原创文章&#xff0c;转载请注明出处&#xff1a; https://blog.csdn.net/qq_59075481/article/details/136110636 前言 Win 10/11 的虚拟桌面微软暂时没有开放接口&#xff0c;有很多信息对开发者是闭塞的&#xff0c;…

Qt QWidget以及各种控件、布局 核心属性(适合入门使用时查询)

目录 1. QWidget核心属性 2. 按钮类控件 2.1 PushButton 核心属性 2.2 RadioButton 核心属性 2.3 CheckBox 和 Tool Button 核心属性 3. 显示类控件 3.1 Label 核心属性 3.2 LCDNumber 核心属性 3.3 ProgressBar 核心属性 3.4 Calendar Widget 核心属性 4. 输入类控…

Photoshop 中的“彩蛋”

在 Photoshop 中隐藏了几个“彩蛋” Easter Eggs&#xff0c;是开发者留下的小秘密或玩笑功能&#xff0c;也许是他们在紧张的开发过程中的一种自我调节吧&#xff0c;就如复活节彩蛋一样&#xff0c;同样也可以给 Photoshop 的用户们带来一点小“惊喜”。 这些彩蛋通常以有趣的…

上位机图像处理和嵌入式模块部署(借鉴与学习)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于很多学院派的同学来说&#xff0c;他们对市场的感觉一般是比较弱的。如果写一个软件的话&#xff0c;或者说开发一个项目的话&#xff0c;他们…

【C++关联式容器】unordered_map

目录 unordered_map 1. pair类型 2. 关联式容器额外的类型别名 3. 哈希桶 4. 无序容器对关键字类型的要求 5. Member functions 5.1 constructor、destructor、operator 5.1.1 constructor 5.1.2 destructor 5.1.3 operator 5.2 Capacity ​5.2.1 empty 5.2.2 si…

C/C++内存管理:new、delete功能及原理实现

目录 一、C/C内存分布 二、C中内存管理方式 2.1new/delete操作内置类型 2.2 new和delete操作自定义类型 三、operator new与operator delete函数 四、new和delete的实现原理 4.1内置类型 4.2自定义类型 五、定位new 一、C/C内存分布 int globalVar 1; static int sta…

Java学习第十三节之三种初始化和内存分析

三种初始化 package array;public class ArrayDemo02 {public static void main(String[] args) {//静态初始化&#xff1b;创建赋值int[] a {1, 2, 3, 4, 5, 6, 7, 8};System.out.println(a[0]);for (int i 0; i <a.length; i) {System.out.println(a[i]);}//动态初始化…

你的电脑关机吗

目录 程序员为什么不喜欢关电脑&#xff1f; 电脑长时间不关机会怎样? 电脑卡顿 中度风险 硬件损耗 能源浪费 散热问题 软件问题 网络安全问题 程序员为什么不喜欢关电脑&#xff1f; 大部分人都会选择将电脑进行关机操作。其实这不难理解&#xff0c;毕竟人类都需要…