本题有点类似约瑟夫环问题,但从复杂性来讲,是在约瑟夫环的基础上增加了一层,可以说是前后两次的约瑟夫问题。主要的思路就是用一个标记数组表示哪些元素已经被选出来了,再将他们输出。本题最巧妙的一部分就是运用+/-1将两个操作统一起来了。
#include <stdio.h>
#define maxn 25
int n, k, m, a[maxn];
int go(int p, int d, int t)
{
while(t--)
{
do{
p = (p+d+n-1) % n + 1;//巧妙的逐步推演
}while(a[p] == 0);
}
return p;
}
int main()
{
while(scanf("%d%d%d", &n, &k, &m) == 3 && n)
{
for(int i = 1; i <= n; i++)
a[i] = i;
int left = n;
int p1 = n, p2 = 1;
while(left)
{
p1 = go(p1, 1, k);//寻找共性
p2 = go(p2, -1, m);
printf("%3d", p1);
left--;
if(p2 != p1)//p1与p2相同时只取其中的一个
{
printf("%3d", p2);
left--;
}
a[p1] = a[p2] = 0;//表示当前格子已经走过
if(left)
printf(",");
}
printf("\n");
}
return 0;
}