/*
约瑟夫环的裸题
*/
#include <iostream>
#include <stdio.h>
#define MAXN 10010
using namespace std;
int arge[MAXN];
int main(void)
{
int m, n, k;
while (scanf_s("%d%d%d", &n, &k, &m) != EOF && n + k + m)
{//n是元素的个数,k是每隔k个开始跳,m是起始位子
for (int i = 0; i < n; i++)
arge[i] = i + 1;//初始化环
for (int i = m - 1; i < n - 1; i++)
arge[i] = arge[i + 1];//覆盖第一个数
int position = m - 1;
n--;
while (n != 1)
{//只剩一个的时候就结束循环
position = (position + k - 1) % n;//这里值得注意的是因为覆盖的时候已经向前移了一位,所以要减一
for (int i = position; i < n - 1; i++)
arge[i] = arge[i + 1];//覆盖
n--;//剩余个数减一
}
printf("%d\n", arge[0]);
}
return 0;
}
UVA - 1394 - And Then There Was One
最新推荐文章于 2020-03-10 16:43:37 发布