#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){
        int left=n;
        for(int i=1; i<=n; i++) a[i]=i;
        int p1=n, p2=1;
        while(left){
            p1=go(p1, 1, k);
            p2=go(p2, -1, m);
            printf("%3d", p1); left--;
            if(p2!=p1) { printf("%3d", p2); left--; }
            a[p1]=a[p2]=0;
            if(left) printf(",");
        }
        printf("\n");
    }
    return 0;
}

书上代码

对于go函数中的操作

p=(p+d+n-1)%n+1;

实现了在循环数组中双向行走

注:题中1~n是逆时针

当顺时针(1~n)时,实现循环有p=(p+n)%n+1

当逆时针(n~1)时,实现循环有p=(p+n-2)%n+1

所以将两者共同点抽取出来

有p=(p+d+n-1)%n+1

当顺时针时d==1

当逆时针时d==-1

综上