1. 程式人生 > >The Dole Queue【紫書例題4.3】

The Dole Queue【紫書例題4.3】

題意:

n個人圍成個圓,從1到n,一個人從1數到k就讓第k個人離場,了另一個人從n開始數,數到m就讓第m個人下去,直到剩下最後一個人,並依次輸出離場人的序號。

水題,直接上標程了

#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;
}