首先,准备4张扑克牌,跟随魔术步骤,来一起“见证奇迹”。
👇执行如下操作👇
按照上面的魔术步骤用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 魔术成功!最后一张牌与预留的牌相符。
❤表演结束,你的牌对上了吗?(●'◡'●)