2-3 jmu-報數遊戲 (15 分)
阿新 • • 發佈:2018-12-14
報數遊戲是這樣的:有n個人圍成一圈,按順序從1到n編好號。從第一個人開始報數,報到m(m<n)的人退出圈子;下一個人從1開始報數,報到m的人退出圈子。如此下去,直到留下最後一個人。其中n是初始人數;m是遊戲規定的退出位次(保證為小於n的正整數)。要求用佇列結構完成。輸出數字間以空格分隔,但結尾不能有多餘空格。
輸入樣例:
5 3
輸出樣例:
3 1 5 2 4
輸入樣例:
5 6
輸出樣例:
error!
#include<stdio.h>
#include<stdlib. h>
typedef int ElemeType;
typedef struct cod
{
ElemeType data[100001];
int rare,front;
int MaxSize;
} CirQueue;
CirQueue *InitCQueue() //將佇列置為空
{
CirQueue *q=(CirQueue *)malloc(sizeof(struct cod));
q->rare=q->front=0;
q->MaxSize=100001;
return q;
}
int EnCqueue(CirQueue * q,ElemeType x) //入隊
{
if(((q->rare)+1)%(q->MaxSize)==q->front)//判斷佇列是否滿了
{
printf("The Queue is flow!!!!\n");
return 0;
}
q->data[q->rare]=x;
q->rare=(q->rare+1)%(q->MaxSize);//將對應的下表向後移動
return 1;
}
int DeCqueue(CirQueue *q,ElemeType *x) //出隊
{
if(q->rare==q->front) //判斷表是否為空
{
printf("\nGame over!!!!!!!!\n");
return 0;
}
*x=q->data[q->front];
q->front=(q->front+1)%(q->MaxSize);//將對應的下表向後移動
return 1;
}
int test()
{
CirQueue *q=InitCQueue();
int count;
int key;
int con;
int cache;
scanf("%d",&count);
scanf("%d",&con);
if(con>count){
printf("error!");
return 0;
}
cache=con;
int i=1;
while(count--){
EnCqueue(q,i++);
}
while(q->rare!=q->front)
{
while(--con){//跳過前面的值
DeCqueue(q,&key);//先取出值
EnCqueue(q,key);//再次存入值
}
if(((q->front)+1)%(q->MaxSize)==q->rare)//判斷最後一個不加上空格
{
DeCqueue(q,&key);//取除但是不存入
printf("%d",key);//顯示取出的值
break;
}
if(q->rare!=q->front)
{
DeCqueue(q,&key);//取除但是不存入
printf("%d ",key);//顯示取出的值
}
con=cache;//讓計數器回到原來的值
}
}
int main()
{
test();
return 0;
}