The Dole Queue UVA - 133

题目链接:https://vjudge.net/problem/UVA-133
The Dole Queue UVA - 133题目大意:n(n<20)个人站成一圈,逆时针编号为1~n。有两个官员,A从1逆时针数,B从n开始顺时针数。再每一轮中,官员A数k个就停下来,B数m个就停下来(注意两个官员停在同一个人身上)。接下来被官员选中的人(1或2个)离开队伍。
输入n,k,m。输出每轮里被选中人的编号(如果有两个人,先输入被A选中的)。
注意:输出的每个数应该恰好占3列。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define maxn 30
int arr[maxn];
int Cicle1(int t1, int N, int _k) {
    while(t1--) {
        _k++;
        if(_k > N)
            _k %= N;
        if(!arr[_k]) t1++;
    }
    return _k;
}

int Cicle2(int t1, int N, int _m) {
     while(t1--) {
        _m--;
        if(_m<=0) _m += N;
        if(!arr[_m])
            t1++;
    }
    return _m;
}

int main()
{
    freopen("i.txt","r",stdin);
    int N,k,m,left,t1,t2;
    while(scanf("%d%d%d",&N,&k,&m) && N) {
        memset(arr, 0, sizeof(arr));
        for(int i = 1; i <= N; i++) arr[i] = i;
        left = N;
        int _k = 0, _m = N+1;
        while(left) {
            t1 = k, t2 = m;
            _k = Cicle1(t1, N, _k);
            _m = Cicle2(t2, N, _m);
            if(arr[_k]==arr[_m]) {
                printf("%3d",arr[_k]);
                left--;
            }
            else {
                printf("%3d%3d",arr[_k],arr[_m]);
                left -= 2;
            }
            if(left) printf(",");
            arr[_k] = 0, arr[_m] = 0;
        }
        printf("\n");
    }
}