当前位置: 首页 > article >正文

C++实现2025刘谦魔术(勺子 筷子 杯子)

目录

1、魔术步骤

2、C++代码

2.1、定义物品

2.2、枚举初始顺序

2.3、进行step2筷子交换

2.4、进行step3杯子交换

2.5、进行step4勺子交换

3、运行结果

4、全部源码


又是一年春晚啦,今年比较期待的是刘谦的魔术表演,现在用C++实现刘谦的第一个魔术,通过三次交换物体顺序,无论大家初始顺序是什么样子的,最后顺序都保持一致。

刘谦2025魔术揭秘 C++实现(勺子杯子筷子)

也可以点击此处跳转哦

1、魔术步骤

再给大家交代一下魔术规则吧:

step1:拿出筷子 杯子 勺子三种物品,从左到右随意顺序摆放。

step2:筷子与左边东西互换 如果筷子已经在左侧位置 不需要动。

step3:杯子与右边东西交换 如果杯子已经在最右侧 不需要动。

step4:勺子与左边东西交换 如果勺子已经在最左侧 不需要动。

2、C++代码

2.1、定义物品

//基础物品名称
std::string spoon		= "勺子";
std::string chopsticks	= "筷子";
std::string cup			= "杯子";

2.2、枚举初始顺序

一共只有6种顺序:

(1)勺子 筷子 杯子;

(2)勺子 杯子 筷子;

(3)筷子 勺子 杯子;

(4)筷子 杯子 勺子;

(5)杯子 勺子 筷子;

(6)杯子 筷子 勺子;

//初始顺序
std::list<std::string> baseOrder[6];

//勺子 筷子 杯子
baseOrder[0].push_back(spoon);
baseOrder[0].push_back(chopsticks);
baseOrder[0].push_back(cup);

//勺子 杯子 筷子
baseOrder[1].push_back(spoon);
baseOrder[1].push_back(cup);
baseOrder[1].push_back(chopsticks);

//筷子 勺子 杯子
baseOrder[2].push_back(chopsticks);
baseOrder[2].push_back(spoon);
baseOrder[2].push_back(cup);

//筷子 杯子 勺子
baseOrder[3].push_back(chopsticks);
baseOrder[3].push_back(cup);
baseOrder[3].push_back(spoon);

//杯子 勺子 筷子
baseOrder[4].push_back(cup);
baseOrder[4].push_back(spoon);
baseOrder[4].push_back(chopsticks);

//杯子 筷子 勺子
baseOrder[5].push_back(cup);
baseOrder[5].push_back(chopsticks);
baseOrder[5].push_back(spoon);

2.3、进行step2筷子交换

//step2 筷子与左边东西互换 如果筷子已经在左侧位置 不需要动
for (std::list<std::string>::iterator it = baseOrder[i].begin(); it != baseOrder[i].end(); ++it)
{
	if (*it == chopsticks && it != baseOrder[i].begin())
	{
		std::iter_swap(it, getPreviousElement(baseOrder[i], it));
	}
}

2.4、进行step3杯子交换

//step3 杯子与右边东西交换 如果杯子已经在最右侧 不需要动
for (std::list<std::string>::iterator it = baseOrder[i].begin(); it != baseOrder[i].end(); ++it)
{
	if (*it == cup && std::next(it) != baseOrder[i].end())
	{
		std::iter_swap(it, getNextElement(baseOrder[i], it));
	}
	
}

2.5、进行step4勺子交换

//step4 勺子与左边东西交换 如果勺子已经在最左侧 不需要动
for (std::list<std::string>::iterator it = baseOrder[i].begin(); it != baseOrder[i].end(); ++it)
{
	if (*it == spoon && it != baseOrder[i].begin())
	{
		std::iter_swap(it, getPreviousElement(baseOrder[i], it));
	}

}

3、运行结果

初始顺序0: 勺子 筷子 杯子
第1次交换:筷子 勺子 杯子
第2次交换:筷子 勺子 杯子
第3次交换:勺子 筷子 杯子

初始顺序1: 勺子 杯子 筷子
第1次交换:勺子 筷子 杯子
第2次交换:勺子 筷子 杯子
第3次交换:勺子 筷子 杯子

初始顺序2: 筷子 勺子 杯子
第1次交换:筷子 勺子 杯子
第2次交换:筷子 勺子 杯子
第3次交换:勺子 筷子 杯子

初始顺序3: 筷子 杯子 勺子
第1次交换:筷子 杯子 勺子
第2次交换:筷子 勺子 杯子
第3次交换:勺子 筷子 杯子

初始顺序4: 杯子 勺子 筷子
第1次交换:杯子 筷子 勺子
第2次交换:筷子 勺子 杯子
第3次交换:勺子 筷子 杯子

初始顺序5: 杯子 筷子 勺子
第1次交换:筷子 杯子 勺子
第2次交换:筷子 勺子 杯子
第3次交换:勺子 筷子 杯子

请按任意键继续. . .

最后大家可以看到,无论初始顺序是什么样子的,经过三次交换顺序之后,最后的结果都是勺子、筷子、杯子这一种顺序。

4、全部源码

#include <iostream>
#include <string>
#include <list>
#include <algorithm>

template<typename T>
typename std::list<T>::iterator getPreviousElement(std::list<T>& lst, typename std::list<T>::iterator it) {
	// 检查迭代器是否为列表的起始位置
	if (it == lst.begin()) {
		std::cerr << "The iterator is at the beginning of the list, no previous element." << std::endl;
		return lst.end();
	}
	// 返回上一个元素的迭代器
	return --it;
}

template<typename T>
typename std::list<T>::iterator getNextElement(std::list<T>& lst, typename std::list<T>::iterator it) {
	// 检查迭代器是否为列表的起始位置
	if (it == lst.end()) {
		std::cerr << "The iterator is at the end of the list, no next element." << std::endl;
		return lst.end();
	}
	// 返回上一个元素的迭代器
	return ++it;
}

int main()
{
	//基础物品名称
	std::string spoon		= "勺子";
	std::string chopsticks	= "筷子";
	std::string cup			= "杯子";

	//初始顺序
	std::list<std::string> baseOrder[6];

	//勺子 筷子 杯子
	baseOrder[0].push_back(spoon);
	baseOrder[0].push_back(chopsticks);
	baseOrder[0].push_back(cup);

	//勺子 杯子 筷子
	baseOrder[1].push_back(spoon);
	baseOrder[1].push_back(cup);
	baseOrder[1].push_back(chopsticks);

	//筷子 勺子 杯子
	baseOrder[2].push_back(chopsticks);
	baseOrder[2].push_back(spoon);
	baseOrder[2].push_back(cup);

	//筷子 杯子 勺子
	baseOrder[3].push_back(chopsticks);
	baseOrder[3].push_back(cup);
	baseOrder[3].push_back(spoon);

	//杯子 勺子 筷子
	baseOrder[4].push_back(cup);
	baseOrder[4].push_back(spoon);
	baseOrder[4].push_back(chopsticks);

	//杯子 筷子 勺子
	baseOrder[5].push_back(cup);
	baseOrder[5].push_back(chopsticks);
	baseOrder[5].push_back(spoon);

	//打印初始顺序
	for (int i = 0; i < 6; i++)
	{
		//打印初始顺序
		std::cout << "初始顺序" << i << ": ";
		for (std::list<std::string>::iterator it = baseOrder[i].begin(); it != baseOrder[i].end(); ++it)
		{
			std::cout << *it << " ";
		}
		std::cout << std::endl;

		//step2 筷子与左边东西互换 如果筷子已经在左侧位置 不需要动
		for (std::list<std::string>::iterator it = baseOrder[i].begin(); it != baseOrder[i].end(); ++it)
		{
			if (*it == chopsticks && it != baseOrder[i].begin())
			{
				std::iter_swap(it, getPreviousElement(baseOrder[i], it));
			}
		}

		std::cout << "第1次交换:";
		for (std::list<std::string>::iterator it = baseOrder[i].begin(); it != baseOrder[i].end(); ++it)
		{
			std::cout << *it << " ";
		}
		std::cout << std::endl;

		//step3 杯子与右边东西交换 如果杯子已经在最右侧 不需要动
		for (std::list<std::string>::iterator it = baseOrder[i].begin(); it != baseOrder[i].end(); ++it)
		{
			if (*it == cup && std::next(it) != baseOrder[i].end())
			{
				std::iter_swap(it, getNextElement(baseOrder[i], it));
			}
			
		}

		std::cout << "第2次交换:";
		for (std::list<std::string>::iterator it = baseOrder[i].begin(); it != baseOrder[i].end(); ++it)
		{
			std::cout << *it << " ";
		}
		std::cout << std::endl;

		//step4 勺子与左边东西交换 如果勺子已经在最左侧 不需要动
		for (std::list<std::string>::iterator it = baseOrder[i].begin(); it != baseOrder[i].end(); ++it)
		{
			if (*it == spoon && it != baseOrder[i].begin())
			{
				std::iter_swap(it, getPreviousElement(baseOrder[i], it));
			}

		}

		std::cout << "第3次交换:";
		for (std::list<std::string>::iterator it = baseOrder[i].begin(); it != baseOrder[i].end(); ++it)
		{
			std::cout << *it << " ";
		}
		std::cout << std::endl;


		std::cout << std::endl;
	}
	
	system("pause");
	return 0;
}


http://www.kler.cn/a/525174.html

相关文章:

  • 【漫话机器学习系列】064.梯度下降小口诀(Gradient Descent rule of thume)
  • git困扰的问题
  • 9.8 实战:使用 GPT Builder 开发定制化 ChatGPT 应用
  • RK3588平台开发系列讲解(ARM篇)ARM64底层中断处理
  • 【东雪莲病毒|罕见病毒|Traitor Virus】
  • java多线程学习笔记
  • 第十六届蓝桥杯大赛软件赛(编程类)知识点大纲
  • 25年1月-A组(萌新)- 云朵工厂
  • 本地部署Deepseek R1
  • S价标准价与V价移动平均价的逻辑,以SAP MM采购订单收货、发票校验过程举例
  • 【Valgrind】安装报错: 报错有未满足的依赖关系: libc6,libc6-dbg
  • 【硬件测试】基于FPGA的QPSK+帧同步系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR
  • 网络爬虫学习:应用selenium获取Edge浏览器版本号,自动下载对应版本msedgedriver,确保Edge浏览器顺利打开。
  • Vim安装与配置教程(解决软件包Vim没有安装可候选)
  • 【make】makefile变量全解
  • DeepSeek-R1 本地部署模型流程
  • 【愚公系列】《循序渐进Vue.js 3.x前端开发实践》032-组件的Teleport功能
  • 练习(复习)
  • Nginx 安装配置指南
  • ESP32-S3模组上跑通esp32-camera(37)
  • 什么是波士顿矩阵,怎么制作?AI工具一键生成战略分析图!
  • Java基础知识-第13章-Java多线程编程基础
  • 【BQ3568HM开发板】智能家居中控屏界面设计:打造便捷的家居控制体验
  • 阿里云 - RocketMQ入门
  • 蓝桥杯嵌入式uart,iic,adc_scan模版
  • js基础(黑马程序员)