The Dole Queue
The Dole Queue |
In a serious attempt to downsize (reduce) the dole queue, The New National Green Labour Rhinoceros Party has decided on the following strategy. Every day all dole applicants will be placed in a large circle, facing inwards. Someone is arbitrarily chosen as number 1, and the rest are numbered counter-clockwise up to N (who will be standing on 1's left). Starting from 1 and moving counter-clockwise, one labour official counts off k applicants, while another official starts from N and moves clockwise, counting m applicants. The two who are chosen are then sent off for retraining; if both officials pick the same person she (he) is sent off to become a politician. Each official then starts counting again at the next available person and the process continues until no-one is left. Note that the two victims (sorry, trainees) leave the ring simultaneously, so it is possible for one official to count a person already selected by the other official.
Input
Write a program that will successively read in (in that order) the three numbers (N, k and m; k, m > 0, 0 < N < 20) and determine the order in which the applicants are sent off for retraining. Each set of three numbers will be on a separate line and the end of data will be signalled by three zeroes (0 0 0).
Output
For each triplet, output a single line of numbers specifying the order in which people are chosen. Each number should be in a field of 3 characters. For pairs of numbers list the person chosen by the counter-clockwise official first. Separate successive pairs (or singletons) by commas (but there should not be a trailing comma).
Sample input
10 4 3 0 0 0
Sample output
4 8, 9 5, 3 1, 2 6, 10, 7
题目大意:输入n,k,m;由n个数组成的环,每回操作删除逆时针的第k个和顺时针的第m个(同时删除)
注意:1、相同时只输出一个。
2、三角型代表空格。
3、最后一个输出不带有‘,’。
解题思路:由两个下标,lift和right,分别转动。
#include<stdio.h>
#include<iostream>
using namespace std;
#define N 25
int num[N];
int main()
{
int n,lift,right;
int i;
while(cin>>n>>lift>>right,n||lift||right)
{
//Init.
int cnt=n;
int now_lift=1,now_right=n;
for(i = 1;i <= n; i++)
num[i]=1;
while(1)
{
//move lift.
for(i=0;;now_lift++)
{
if(now_lift==n+1) now_lift=1;
if(num[now_lift])
{ i++;
if(i==lift)
break;
}
}
//move right.
for(i=0;;now_right--)
{
if(now_right==0) now_right=n;
if(num[now_right])
{ i++;
if(i==right)
break;
}
}
if(now_lift!=now_right)
{
printf("%3d%3d",now_lift,now_right);
num[now_lift]=0;
num[now_right]=0;
cnt-=2;
}
else if(now_lift==now_right)
{ printf("%3d",now_right);
num[now_lift]=0;
cnt--;
}
if(cnt)
cout<<",";
else
break;
}
cout<<endl;
}
return 0;}