您的位置:首页 > 产品设计 > UI/UE

UVA 133 The Dole Queue

2015-07-28 08:16 429 查看

题目

救济金发放

分析

双向约瑟夫环问题。

思路

链表不一定要指针实现,以下是数组模拟。

代码

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: