题目描述:
分析:
初始时用一个数组来表示人员的编号,如果一个人被选中,则用0来表示。模拟一下即可。
代码如下:
#include<cstdio>
using namespace std;
const int maxn = 20+5;
int N, k, m;
int a[maxn];
/*移动函数,以k作为标记表示顺时针还是逆时针*/
int move(int p, int k, int t)
{
while(t--)
{
do{
p = (p+k+N-1) % N + 1;//注意因为是圈需要循环,所以要取余,有因为不是从0开始,所以要先减1,取余后加一
}while(a[p] == 0);//走到下一个非0数字
}
return p;
}
int main()
{
while(scanf("%d%d%d",&N, &k, &m)!=EOF)
{
if(N==0) break;
for(int i=1; i<=N; i++)
{
a[i] = i;
}
int left = N;//还剩下的人数
int p1 = N, p2 = 1; //这里p1初始化为N,是因为要算上1
while(left)
{
p1 = move(p1, 1, k);
p2 = move(p2, -1, m);
printf("%3d", p1);
left--;
if(p1 != p2)
{
printf("%3d", p2);
left--;
}
a[p1] = a[p2] = 0;
if(left)
printf(",");
}
printf("\n");
}
return 0;
}