|
|
#include <bits/stdc++.h>
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
|
#pragma region C++实现的循环双链表通用模板
|
|
|
struct DoubleNode {
|
|
|
int element; //节点存储信息可以根据需要修改!
|
|
|
DoubleNode *previous;
|
|
|
DoubleNode *next;
|
|
|
};
|
|
|
|
|
|
//创建头节点
|
|
|
DoubleNode *CreateLists(int X) {
|
|
|
DoubleNode *Lists = new DoubleNode;
|
|
|
Lists->element = X;
|
|
|
Lists->previous = Lists->next = Lists; //单节点链表形成自循环
|
|
|
return Lists;
|
|
|
}
|
|
|
|
|
|
//删除循环双链表
|
|
|
void DeleteLists(DoubleNode *Lists) {
|
|
|
assert(Lists);
|
|
|
DoubleNode *P = Lists->next, *temp;
|
|
|
Lists->next = P->previous = NULL;
|
|
|
while (P != Lists) {
|
|
|
temp = P->next;
|
|
|
P->next = temp->previous = NULL;
|
|
|
delete P;
|
|
|
P = temp;
|
|
|
}
|
|
|
delete Lists;
|
|
|
}
|
|
|
|
|
|
//在双循环链表中查找值X
|
|
|
DoubleNode *Find(int X, DoubleNode *Lists) {
|
|
|
assert(Lists);
|
|
|
DoubleNode *P = Lists;
|
|
|
do {
|
|
|
if (P->element == X)
|
|
|
return P;
|
|
|
else
|
|
|
P = P->next;
|
|
|
} while (P != Lists);
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
//按值X进行删除
|
|
|
void Delete(int X, DoubleNode *Lists) {
|
|
|
DoubleNode *temp = Find(X, Lists); //如果没找到X,则temp=NULL
|
|
|
if (temp) {
|
|
|
temp->previous->next = temp->next;
|
|
|
temp->next->previous = temp->previous;
|
|
|
temp->previous = temp->next = NULL;
|
|
|
delete temp;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//在循环双链表中插入数值X
|
|
|
void Insert(DoubleNode *P, int X) {
|
|
|
DoubleNode *tempX = new DoubleNode;
|
|
|
tempX->element = X;
|
|
|
tempX->previous = P;
|
|
|
tempX->next = P->next;
|
|
|
P->next->previous = tempX;
|
|
|
P->next = tempX;
|
|
|
}
|
|
|
|
|
|
//输出循环双链表
|
|
|
void OutputLists(DoubleNode *Lists) {
|
|
|
DoubleNode *P = Lists;
|
|
|
do {
|
|
|
cout << P->element << " ";
|
|
|
P = P->next;
|
|
|
} while (P != Lists);
|
|
|
cout << endl;
|
|
|
}
|
|
|
|
|
|
//获取节点的数量
|
|
|
int GetNumofNodes(DoubleNode *Lists) {
|
|
|
int count = 1;
|
|
|
DoubleNode *P = Lists->next;
|
|
|
while (P != Lists) {
|
|
|
count++;
|
|
|
P = P->next;
|
|
|
}
|
|
|
return count;
|
|
|
}
|
|
|
|
|
|
//循环双链表两节点互换
|
|
|
void DoExchange(DoubleNode *A, DoubleNode *B) {
|
|
|
if (A == B)
|
|
|
return;
|
|
|
DoubleNode *PreA = A->previous;
|
|
|
DoubleNode *PostA = A->next;
|
|
|
DoubleNode *PreB = B->previous;
|
|
|
DoubleNode *PostB = B->next;
|
|
|
//假如循环双链表只包含A、B两个节点
|
|
|
if (PreA == PostA && PostA == B)
|
|
|
return;
|
|
|
//考虑相邻情况
|
|
|
if (PostA == B) {
|
|
|
PreA->next = B;
|
|
|
B->previous = PreA;
|
|
|
B->next = A;
|
|
|
A->previous = B;
|
|
|
A->next = PostB;
|
|
|
PostB->previous = A;
|
|
|
return;
|
|
|
}
|
|
|
if (PostB == A) {
|
|
|
PreB->next = A;
|
|
|
A->previous = PreB;
|
|
|
A->next = B;
|
|
|
B->previous = A;
|
|
|
B->next = PostA;
|
|
|
PostA->previous = B;
|
|
|
return;
|
|
|
}
|
|
|
//再考虑其它一般情况
|
|
|
PreA->next = B;
|
|
|
B->previous = PreA;
|
|
|
B->next = PostA;
|
|
|
PostA->previous = B;
|
|
|
PreB->next = A;
|
|
|
A->previous = PreB;
|
|
|
A->next = PostB;
|
|
|
PostB->previous = A;
|
|
|
}
|
|
|
|
|
|
#pragma endregion C++实现的循环双链表通用模板
|
|
|
|
|
|
int main() {
|
|
|
int n, k, p;
|
|
|
cin >> n >> k >> p;
|
|
|
|
|
|
//创建循环双链表head
|
|
|
DoubleNode *head = CreateLists(1);
|
|
|
DoubleNode *P = head; //游标
|
|
|
//将头节点后的n-1个数字插入
|
|
|
for (int i = 1; i < n; i++) {
|
|
|
//插入数据
|
|
|
Insert(P, i + 1);
|
|
|
//移动游标
|
|
|
P = P->next;
|
|
|
}
|
|
|
|
|
|
//牌的初始化
|
|
|
queue<int> pai;
|
|
|
for (int i = 0; i < k; ++i) {
|
|
|
pai.push(i + 1);
|
|
|
}
|
|
|
|
|
|
vector<int> v1;
|
|
|
int count = 0;
|
|
|
//模拟发牌
|
|
|
while (!pai.empty()) {
|
|
|
//1、 将最上面的牌发给小明右手边的人
|
|
|
int c = pai.front();
|
|
|
pai.pop();
|
|
|
count++;
|
|
|
if (count % n == 0) {
|
|
|
//小明人拿的牌
|
|
|
v1.push_back(c);
|
|
|
}
|
|
|
//2、每发完一张牌,他必须将接下来的 P 张牌(1≤P≤10)一张一张地依次移到最后,放在牌堆的底部。
|
|
|
for (int i = 0; i < p; ++i) {
|
|
|
c = pai.front();
|
|
|
pai.push(c);
|
|
|
pai.pop();
|
|
|
}
|
|
|
}
|
|
|
//排序
|
|
|
sort(v1.begin(), v1.end());
|
|
|
for (int i = 0; i < v1.size(); ++i) {
|
|
|
cout << v1[i] << endl;
|
|
|
}
|
|
|
return 0;
|
|
|
}
|