题目
分析
双向约瑟夫环问题。
思路
链表不一定要指针实现,以下是数组模拟。
代码
#include <cstdio>
#define N 20
int main()
{
int n, k, m;
int app[N+5];
while (scanf("%d%d%d", &n, &k, &m), n, k, m) {
k = (k % n) ? k % n : n;
m = (m % n) ? m % n : n;
for (int i = 1; i <= n; i++) app[i] = i;
int ki = n, mi = 1;
while (1) {
for (int i = k; i > 0; i--) {
if (ki == n) ki = 1; /* 回环 */
else ki++;
if (app[ki] == 0) i++;
}
for (int i = m; i > 0; i--) {
if (mi == 1) mi = n; /* 回环 */
else mi--;
if (app[mi] == 0) i++;
}
if (ki == mi) {
int a = 0;
for (int i = 1; i <= n; i++)
if (app[i] != 0) a++;
if (a == 1) {
printf("%3d\n", ki);
break;
} else {
printf("%3d,", ki);
}
} else {
int b = 0;
for (int i = 1; i <= n; i++)
if (app[i] != 0) b++;
if (b == 2) {
printf("%3d%3d\n", ki, mi);
break;
} else {
printf("%3d%3d,", ki, mi);
}
}
app[ki] = app[mi] = 0;
}
}
return 0;
}