待调试 约瑟夫问题

来源:互联网 发布:.net求数组中元素相加 编辑:程序博客网 时间:2024/05/01 11:43
/*约瑟夫问题 n只猴子围成一圈选大王(编号1~n),开始数数,数到m 的猴子退出圈外,剩下的猴子再接着从1开始数,这样直到圈内只剩下一只猴子时。这只猴子就是国王了。输入n m . 输入最后一行是0 0   对每行输入输出对应的猴王编号。*//*使用循环队列  因为可以克服假溢出的现象*/#include <stdio.h>#include<string.h>//#include<queue>//#define maxsize 100typedef struct queue{int  *q;        //数组头指针int head,tail; //队列的头、尾指针    int queuesize;  //定义数组大小}SqQueue;void InitQueue(SqQueue *q) //队列初始化{   q.head=0;q.tail=0;q.queuesize=8;q.q=(int *)malloc(sizeof(int) * q.queuesize); //分配内存}void EnQueue(SqQueue *q,int key)   //入队{ int tail=(q.tail+1)%q.queuesize;if(tail==q.head){printf("the queue is filled");}elseq.q[q.tail]=key;q.tail=tail;}int  DeQueue(SqQueue *q)  //出队{int temp;if(q.tail==q.head){printf("the queue is empty\n");}else{temp=q.q[q.head];q.head(=q.head+1)%q.queuesize;}return temp;}void main(){int n,m,A;int a[];SqQueue *q;scanf("%d %d",&n,&m);InitQueue(*q);q.queuesize=n+1;for(int i=1;i<=n;i++){EnQueue(q,a[i]);  //所有元素入队;}for(i=1;i<=(m-1);i++){   int t=DeQueue(q);  EnQueue(q,t);  while(i==m)  {deleteDeQueue(q); //q.temp;  } if((q.head+1)%q.queuesize==q.tail)  //队列自身一个元素时 { A=DeQueue(q);  break;}}printf("%d",A);}

0 0
原创粉丝点击