题目描述
代码
#include<stdio.h>
#define maxn 25
int n, k, m, a[maxn]; // n 是人数,官员 A 从 1 开始逆时针数数,数 k 个然后停下来,官员 B 从 n 开始数数,数 m 个停下来
// 逆时针走 t 步,步长是 d (-1 表示顺时针走),返回新位置,从 p 出发
int go(int p, int d, int t)
{
while (t--)
{
do {
p = (p - 1 + d + n) % n + 1; // 这里是先将 <1 到 n> 映射到 <0 到 n - 1>,加 n 是为了处理步长为负的情况
} while (a[p] == 0); // 走到下一个非 0 数字
}
return p;
}
int main()
{
while (scanf("%d%d%d", &n, &k, &m) == 3 && n)
{
for (int i = 1; i <= n; i++)
a[i] = i; // 给人员编号
int left = n; // 剩余人数
int p1 = n, p2 = 1; // A 从 1 开始,逆时针点数,所以初始值取 n,那么下一个数就是 1,B 从 n 开始,顺时针点数,初始值为 1,下一个数就是 n
while (left)
{
p1 = go(p1, 1, k); // 逆时针走 k 步
p2 = go(p2, -1, m); // 顺时针走 m 步
printf("%3d", p1);
left--;
if (p2 != p1) // 如果 p2 不等于 p1
{
printf("%3d", p2);
left--;
}
a[p1] = a[p2] = 0; // 用过的位置就归零
if (left)
printf(",");
}
printf("\n");
}
return 0;
}