#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
综上