题目描述魔术师刘谦要洗牌了请你写个程序来模拟洗牌的过程。 洗牌分弹牌和切牌两个操作: 弹牌——将牌组等分成两份然后交错相插如当前牌为1 2 3 4 5 6现在开始弹牌先将牌分成1 2 3和4 5 6然后交错相插变成1 4 2 5 3 6 切牌——从牌堆里面拿出连续的一段然后放到顶端。如当前牌为1 2 3 4 5 6切完2~5之间的4张牌后变成2 3 4 5 1 6。输入第一行为两
#include <iostream>
#include <vector>
using namespace std;
// 弹牌操作
vector<int> popCard(vector<int>& cards) {
int n = cards.size();
vector<int> firstHalf(cards.begin(), cards.begin() + n/2);
vector<int> secondHalf(cards.begin() + n/2, cards.end());
vector<int> newCards;
for (int i = 0; i < n/2; i++) {
newCards.push_back(firstHalf[i]);
newCards.push_back(secondHalf[i]);
}
return newCards;
}
// 切牌操作
void cutCard(vector<int>& cards, int b, int e) {
vector<int> cut;
for (int i = b-1; i < e; i++) {
cut.push_back(cards[i]);
}
for (int i = b-1; i < e; i++) {
cards.erase(cards.begin() + b-1);
}
cards.insert(cards.begin(), cut.begin(), cut.end());
}
int main() {
int N, M;
cin >> N >> M;
vector<int> cards(N);
for (int i = 0; i < N; i++) {
cin >> cards[i];
}
for (int i = 0; i < M; i++) {
int operation;
cin >> operation;
if (operation == 0) {
cards = popCard(cards);
} else {
int b, e;
cin >> b >> e;
cutCard(cards, b, e);
}
}
for (int i = 0; i < N; i++) {
cout << cards[i] << " ";
}
return 0;
}
``
原文地址: http://www.cveoy.top/t/topic/hXGo 著作权归作者所有。请勿转载和采集!