56 lines
1.6 KiB
C++
56 lines
1.6 KiB
C++
#include <bits/stdc++.h>
|
||
|
||
#define maxn 25 //n(n<20)个人站成一圈,说好的开大一点,为啥一下就到25了?
|
||
|
||
//官员A数k个就停下来
|
||
int k;
|
||
//官员B数m个就停下来
|
||
int m;
|
||
//n(n<20)个人站成一圈,逆时针编号为1~n
|
||
int n;
|
||
|
||
//标识为0表示离开了~
|
||
int a[maxn];
|
||
|
||
//从p这个位置开始,(1表示是逆时针走,-1表示顺时针走),走t步
|
||
int go(int p, int d, int t) {
|
||
while (t--) {
|
||
do { p = (p + d + n - 1) % n + 1; } while (a[p] == 0); //走到下一个非0数字
|
||
}
|
||
return p;
|
||
}
|
||
|
||
int main() {
|
||
//多次输入
|
||
while (scanf("%d%d%d", &n, &k, &m) == 3 && n) {
|
||
//初始化,放过第一个0,不用
|
||
for (int i = 1; i <= n; i++) a[i] = i;
|
||
|
||
int left = n; //还剩下的人数
|
||
//p1,p2相当于指针,对准一前一后,准备开始~
|
||
int p1 = n, p2 = 1;
|
||
|
||
//如果还有人剩下
|
||
while (left) {
|
||
//正向走K个
|
||
p1 = go(p1, 1, k);
|
||
//逆向走M个
|
||
p2 = go(p2, -1, m);
|
||
|
||
printf("%3d", p1); //printf("%3d",c)表示域宽为3,即输出3位
|
||
//最少有一个人出局了
|
||
left--;
|
||
//如果一前一后都指向了不是同一个人
|
||
if (p2 != p1) {
|
||
printf("%3d", p2);
|
||
left--;
|
||
}
|
||
//标识这两个人都是出局了~
|
||
a[p1] = a[p2] = 0;
|
||
//如果还有剩余的人员,输出逗号
|
||
if (left) printf(",");
|
||
}
|
||
printf("\n");
|
||
}
|
||
return 0;
|
||
} |