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