The Dole Queue
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.
双向约瑟夫环
有个注意点是: 两个方向的遍历是同时进行了的, 不能先进行一个 然后就删除掉
要先同时打印, 然后同时删除~
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Pos{
int num;
struct Pos *last;
struct Pos *next;
}pos;
//建表:
pos *creat(int n) {
int i;
pos *head, *p, *now;
now = (pos*)malloc(sizeof(pos));
head = now;
p = now;
head->num = 1;
for(i = 2; i <= n; i++){
now = (pos*)malloc(sizeof(pos));
now->num = i;
p->next = now;
now->last = p;
p = now;
}
p->next = head;
head->last = p;
return head;
}
int main() {
//输入
int i, N, k, m, flag;
pos *head, *p, *pp, *pm, *pk;
while(scanf("%d %d %d", &N, &k, &m) != EOF && N && k && m) {
head = creat(N);
pk = head;
pm = head->last;
while(head != NULL) {
flag = 0;
for(i = 1; i < k; i++)
pk = pk->next;
for(i = 1; i < m; i++)
pm = pm->last;
if(pk->num == pm->num) {
printf("%3d",pk->num);
p = pk;
pk = pk->next;
pm = pm->last;
pk->last = pm;
pm->next = pk;
if(p->num == head->num) {
if(p->num == pk->num)
head = NULL;
else
head = head->next;
}
free(p);
flag = 1;
}
else {
printf("%3d%3d", pk->num, pm->num);
p = pk;
pp = pk->last;
pk = pk->next;
pp->next = pk;
pk->last = pp;
if(p->num == head->num)
head = head->next;
free(p);
p = pm;
pp = pm->next;
pm = pm->last;
pp->last = pm;
pm->next = pp;
if(pk->num == p->num)
pk = pk->next;
if(p->num == head->num) {
if(p->num == pm->num)
head = NULL;
else
head = head->next;
}
free(p);
flag = 1;
}
if(flag && head != NULL)
printf(",");
}
printf("\n");
}
return 0;
}