题目分析:
有点类似于约瑟夫环,不过这里注意的是他是从两头分开走的,每次走的时候两者互不影响,核心代码:p=(p+d-1+n)%n+1;
AC代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
using namespace std;
int v[25],n,k,m;
int go(int p,int d,int t)//从p点开始走,d=1时逆时针,d=-1时顺时针,走t步,计算到达的点的位置
{
while(t--)
{
do
{
p=(p+d-1+n)%n+1;
}while(v[p]==0);
}
return p;
}
int main()
{
while(1)
{
scanf("%d%d%d",&n,&k,&m);
if(n==0&&k==0&&m==0)
break;
for(int i=1;i<=n;i++)
v[i]=i;
int x=n;
int p1=n,p2=1;//p1代表A走的第一个位置,p2代表B走的第一个位置
while(x)
{
p1=go(p1,1,k);
p2=go(p2,-1,m);
if(p1==p2)
{
x--;
printf("%3d",v[p1]);
v[p1]=0;
}
else
{
x-=2;
printf("%3d%3d",v[p1],v[p2]);
v[p1]=0;
v[p2]=0;
}
if(x)
printf(",");
}
printf("\n");
}
return 0;
}