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

发布于:2025-02-10 ⋅ 阅读:(129) ⋅ 点赞:(0)

目录

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;
}


网站公告

今日签到

点亮在社区的每一天
去签到