The Dole Queue UVA - 133

 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 counterclockwise 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 counterclockwise official first. Separate successive pairs (or singletons) by commas (but there should not be a trailing comma).

Note: The symbol ⊔ in the Sample Output below represents a space.

Sample Input

10 4 3
0 0 0

Sample Output

⊔ ⊔ 4⊔ ⊔ ⊔ ,⊔ ⊔ 9⊔ ⊔ 5,⊔ ⊔ 3⊔ ⊔ 1,⊔ ⊔ 2⊔ ⊔ 6,⊔ ⊔ 10,⊔ ⊔ 7

HINT

  这个题目采用的思路并不复杂,只需要两个简单的函数,一个检测循环终止条件。另一个是对每一个官员调寻得结果来计算的函数,需要区分的是第一次输入和其他次输入的区别,键入以返回值作为下一次的参数,那么除了第一次的参数外都是上一次的结果是已经判断过的,而第一次去不同。具体区分方法看代码。

Accepted

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int exam(int arr[], int n)
{
	for (int i = 1;i <= n;i++)
		if (!arr[i])return 1;
	return 0;
}

int go(int arr[], int n, int k,int v, int flag)
{
	int i = 1;
	while (i <= k)
	{
		
		if (flag == 1 && v == n) v = 1;
		else if (flag == -1 && v == 1)v = n;
		else v += flag;
		if (!arr[v]&&v!=0&&v!=n+1) i++;
	}
	return v;
}

int main()
{
	int n, k, m;
	while (scanf("%d%d%d",&n,&k,&m)!=EOF&&n&&k&&m)
	{
		int arr[50] = { 0 };
		int v1 = 0, v2 = n+1;
		int flag = 0;
		while (exam(arr, n))
		{
			v1 = go(arr, n, k, v1, 1);
			v2 = go(arr, n, m, v2, -1);
			if (flag == 0)
			{
				flag = 1;
				printf("%3d", v1);
			}
			else 
				printf(",%3d", v1);
			if (v1 != v2)printf("%3d", v2);
			arr[v1] = arr[v2] = 1;
		}
		printf("\n");
	}
}
posted @ 2021-02-01 19:10  布拉多1024  阅读(53)  评论(0)    收藏  举报