n(n<20)個人站成一圈,逆時針編號為1~n。有兩個官員,A從1開始逆時針數,B從n開 始順時針數。在每一輪中,官員A數k個就停下來,官員B數m個就停下來(注意有可能兩個 官員停在同一個人上)。接下來被官員選中的人(1個或者2個)離開隊伍。
輸入n,k,m輸出每輪里被選中的人的編號(如果有兩個人,先輸出被A選中的)。例 如,n=10,k=4,m=3,輸出為4 8, 9 5, 3 1, 2 6, 10, 7。注意:輸出的每個數應當恰好占3列。
#include<stdio.h> #define maxn 25 int n, k, m, a[maxn]; //逆時針走t步,步長是d(-1表示順時針走),返回新位置 int go(int p, int d, int t) { while(t--) { do { p = (p+d+n-1) % n + 1; } while(a[p] == 0); //走到下一個非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) { printf("%3d", p2); left--; } a[p1] = a[p2] = 0; if(left) printf(","); } printf("\n"); } return 0; }