觉得主要还是开始的时候,两个官员的位置吧,要往前挪一位
#include <iostream>
#include <cstring>
using namespace std;
int n, k, m, a[25];
int go(int official, int d, int t); // 官员official,d表示顺逆时针(-1表顺时针,1表逆时针),t表示走几步
int main() {
while ((cin >> n >> k >> m).good() && n) {
memset(a, 0, sizeof(a));
for (int i = 1; i <= n; i++)
a[i] = i;
int length = n; // 还剩下的人数
int official1 = n, official2 = 1; // 第一个官员的位置,第二个官员的位置,因为第一个人也记录在内,所以往相应位置挪一位
while (length) {
official1 = go(official1, 1, k);
official2 = go(official2, -1, m);
printf("%3d", official1);
length--;
if (official1 != official2) {
printf("%3d", official2);
length--;
}
a[official1] = a[official2] = 0;
if (length)
putchar(',');
}
putchar('\n');
}
return 0;
}
int go(int official, int d, int t) {
while (t--) {
do {
if (official + d == n + 1) // 当逆时针到末尾时,重新开始循环
official = 1;
else if (official + d == 0) // 当顺时针到末尾时,重新开始循环
official = n;
else
official += d;
}
while (a[official] == 0); // 如果遇到0,则继续循环
}
return official;
}