#include<stdio.h>
#include<stdlib.h>
typedef struct queue//定义队列结构
{
int num;
queue *pre;
queue *next;
}queue;
int main()
{
int n,k,m;
while(scanf("%d%d%d",&n,&k,&m)!=EOF)
{
if(n==0&&k==0&&m==0)
break;
queue *p,*front,*rear;
p=(queue*)malloc(sizeof(queue));
front=p;//队列首位置
int i;
for(i=1;i<=n-1;i++)//逐个添加队列元素
{
queue *point;
point=(queue*)malloc(sizeof(queue));
p->next=point;
p=point;
}
rear=p;//队列末位置为最后一个添加的元素
p->next=front;//构成环形队列
queue *p1,*p2;
p1=front;
p2=front->next;
for(i=1;i<=n-1;i++)//使队列中各元素指向前一元素
{
p2->pre=p1;
p1=p1->next;
p2=p2->next;
}
front->pre=p1;//队首的前一元素为队尾
p=front;
for(i=0;i<n;i++)//初始化队列元素
{
p->num=i+1;
p=p->next;
}
int count=0;
queue *chose1=front->pre;//为下面的循环而设的初值,下同
queue *chose2=rear->next;
while(count!=n)
{
p=chose1->next;//第一次循环p等于队首,接下来等于所选元素的下一元素
for(i=1;i<=k-1;i++)
p=p->next;
chose1=p;
p=chose2->pre;//第一次循环p等于队尾,接下来等于所选元素的前一元素
for(i=1;i<=m-1;i++)
p=p->pre;
chose2=p;
if(chose1!=chose2)//所选的元素不同
{
if(count!=n-2)//不是最后两个元素
printf("%3d%3d,",chose1->num,chose2->num);
else
printf("%3d%3d",chose1->num,chose2->num);
chose1->pre->next=chose1->next;//删除chose1所指向的元素
chose1->next->pre=chose1->pre;
if(chose1->next==chose2)//若chose1的下一元素是chose2
chose1->next=chose2->next;
chose2->pre->next=chose2->next;//删除chose2所指向的元素
chose2->next->pre=chose2->pre;
count=count+2;
}
else//所选的元素相同
{
if(count!=n-1)//同上
printf("%3d,",chose1->num);
else
printf("%3d",chose1->num);
chose1->pre->next=chose1->next;//同上
chose1->next->pre=chose1->pre;
count++;
}
}
printf("\n");
}
return 0;
}
UVa 133 - The Dole Queue(纯C)
最新推荐文章于 2024-02-13 13:56:13 发布