The Dole Queue UVA - 133
题目链接:https://vjudge.net/problem/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");
}
}