您的位置:首页 > 产品设计 > UI/UE

uva 133 The Dole Queue(约瑟夫变形)

2014-07-24 09:09 405 查看



The Dole Queue

In a serious attempt to downsize (reduce) the dole queue, The NewNational Green Labour Rhinoceros Party has decided on the followingstrategy. Every day all dole applicants will be placed in a largecircle, facing inwards. Someone is arbitrarily chosen as
number 1,and the rest are numbered counter-clockwise up to N (who will bestanding on 1's left). Starting from 1 and moving counter-clockwise,one labour official counts off k applicants, while another officialstarts from N and moves clockwise, counting m applicants.
The two whoare chosen are then sent off for retraining; if both officials pickthe same person she (he) is sent off to become a politician. Eachofficial then starts counting again at the next available person andthe process continues until no-one is left. Note
that the two victims(sorry, trainees) leave the ring simultaneously, so it is possible forone official to count a person already selected by the other official.

Input

Write a program that will successively read in (in that order) thethree numbers (N, k and m; k, m > 0, 0 < N < 20) and determinethe order in which the applicants are sent off for retraining. Eachset of three numbers will be on a separate line and the end
of datawill be signalled by three zeroes (0 0 0).

Output

For each triplet, output a single line of numbers specifying the orderin which people are chosen. Each number should be in a field of 3characters. For pairs of numbers list the person chosen by thecounter-clockwise official first. Separate successive pairs
(orsingletons) 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

where


represents a space.

题目:

双向约瑟夫环,n个人围成一圈,编号从1到n,然后分别从逆时针和顺时针方向同时报数,顺时针报到m的人出列,逆时针报到k的人出列,知道最后全部的人都出列。输出

出列的顺序;(注意:如果顺时针和逆时针找到的是同一个人,则只有这一个人出列)

代码:

/***********************************************************/
/******************参考《数据结构编程实验》*****************/
/**********************************************************/
#include <iostream>
#include<stdio.h>
using namespace std;
int p,q,n;
struct dolequeue
{
    int order;
    bool exit;
} qd[21];
void init(int n)//初始化
{
    int i;
    for(i=1; i<=n; i++)
    {
        qd[i].order=i;
        qd[i].exit=true;
    }
}
void dole(int &remain,int m,int k)//处理队列
{
    int cnt=(k%remain?k%remain:remain);
    while(cnt--)
        do
        {
            p=((p+1)%n?(p+1)%n:n);
        }
        while(!qd[p].exit);
    cnt=(m%remain?m%remain:remain);
    while(cnt--)
        do
        {
            q=((q-1+n)%n?(q-1+n)%n:n);
        }
        while(!qd[q].exit);
    if(remain<n)//逗号的输出(先输出逗号在输出数据(第一次除外))
        printf(",");
    printf("%3d",p);
    if(p!=q)
        printf("%3d",q);
    qd[p].exit=qd[q].exit=false;//将标志位置为假(代表此人已经出列)
    remain-=(p==q?1:2);
}
int main()
{
    int k,m,remain;
    while(~scanf("%d%d%d",&n,&k,&m)&&(n||m||k))
    {
        p=0;
        q=n+1;
        init(n);
        remain=n;
        while(remain)
        {
            dole(remain,m,k);
        }
        printf("\n");
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: