要点:
1.建立一个数组储存数值,并建立一个go函数来移动数组元素,若已经出现过,则将数组元素赋值为0,并在数数时跳过即可
难点:
1.建立go函数时的数据关系难以想出,A的初值为n,逆时针步长为-1,但进行第一步后得到n,接着为n-1,n-2……B的初值为1,顺时针步长为1,第一步可以得到1,接着即为2,3……
#include<stdio.h>
int a[25];
int i,n,k,m;
int go(int p, int d, int t)
{
while (t--)
{
do //do-while先运行do后的内容,再判断while
{ //所以无论while是否通过,p值都会改变一次
p = (p + d + n - 1) % n + 1;
}
while (a[p] == 0);//若值为真,继续运行do内表达式,即跳过o
}
return p;
}
int main()
{
while (scanf("%d%d%d", &n, &k, &m) == 3 && n)
{
for (i = 1; i <=n; i++)
a[i] = i;
int left = n;
int p1 = n, p2 = 1;
while (left)
{
p1 = go(p1, 1, k); //p1表示A,从n开始
p2 = go(p2, -1, m); //p2表示B,从1开始
printf("%3d", p1);
left--;
if (p1 != p2)
{
printf("%3d", p2);
left--;
}
a[p1] = a[p2] = 0;
if (left) printf(",");
}
printf("\n");
}
return 0;
}