uva 133 The Dole Queue(约瑟夫变形)
2014-07-24 09:09
405 查看
The Dole Queue |
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 endof 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; }
相关文章推荐
- UVA 133 The Dole Queue 约瑟夫问题的变种,手写链表,模拟
- uva133 The Dole Queue ( 约瑟夫环的模拟)
- uva133 The Dole Queue
- uva133(The Dole Queue)—线性表
- UVA - 133 The Dole Queue
- [UVa 133]The Dole Queue 救济金发放
- uva-133 - The Dole Queue
- UVA - 133 The Dole Queue(自顶向下 模拟)
- UVa 133 The Dole Queue(救济金发放)
- 算法竞赛入门经典(紫书)第四章—— The Dole Queue UVA-133
- UVa 133 - The Dole Queue
- UVa-133 The Dole Queue(约瑟夫环)
- UVA 133 - The Dole Queue
- uva 133 - The Dole Queue
- uva 133 - The Dole Queue
- The Dole Queue UVA - 133
- The Dole Queue - uva 133
- uva 133 - The Dole Queue
- uva133 The Dole Queue ( 约瑟夫环的模拟)
- UVA133-The Dole Queue