#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<set>
#include<map>
#include<queue>
using namespace std;
#define maxn 1005
#define ll long long
#define pi acos(-1.0)
#define inf 0x3f3f3f3f
int ant[25];
int n;
int cmp(int beg,int clock,int d)
{
while(d--)
{
do{
beg=(beg+clock+n-1)%n+1;//注意点3
}while(!ant[beg]);
}
return beg;
}
int main()
{
int k,m,lf,p1,p2;
while(~scanf("%d%d%d",&n,&k,&m))
{
if(n==0)break;
for(int i=1;i<=n;i++)
ant[i]=1;
lf=n;
p1=n,p2=1;//注意点1
while(lf)
{
p1=cmp(p1,1,k);//注意点2
p2=cmp(p2,-1,m);
ant[p1]=ant[p2]=0;
printf("%3d",p1);
lf--;
if(p1!=p2)
{
printf("%3d",p2);
lf--;
}
if(lf)printf(",");
}
printf("\n");
}
return 0;
}
题目里的标号是按逆时针标的
注意点1:第一次选人和后面的选人有点区别,那就是第一次选人时是从第一个人开始算起的(即从当前位置算起),而之后每次选人是从当前位置的下一个位置开始算起,因为当前位置的人被删掉了。为了避免对第一次单独处理,我们将第一次的初始位置按与选人移动的方向的相反的方向移动一位。所以p1,p2的初始值分别为n和1。
注意点2:题目里的标号是按逆时针标的,所以p1的移动方向相当于标号+1,p2的移动方向相当于标号-1。
注意点3:对于越界标号的处理。