有n个人围成一圈,从第1个人开始,1,2,…,m报数,报至m出局,余下的人继续从1,2,…,m报数,重复之前的流程,要求:求出被淘汰编号的序列,及最后剩下的一人是
原来的第几号?(要求:用循环队列解决该问题。)
#ifndef STATUS_H #define STATUS_H #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; #endif
#include <iostream> using namespace std; #include "Status.h" typedef int ElemType; typedef struct { ElemType *base; int front; int rear; int MAXSIZE; }SqQueue; Status InitQueue(SqQueue& Q,int n) //初始化队列 { Q.base = new ElemType[100]; if(!Q.base) { cout << "创建队列失败!"; return ERROR; } Q.front=Q.rear=0; Q.MAXSIZE = n+1;//MAXSIZE是总人数+1,是为了留出一个空位置来放置rear return OK; } void QueueTraverse(SqQueue Q) //遍历队列 { int i; i=Q.front; while(i!=Q.rear) { cout<<Q.base[i]<<" "; i=(i+1)%Q.MAXSIZE; } cout<<endl; } Status EnQueue(SqQueue& Q,ElemType e) //入队 { if((Q.rear+1)%Q.MAXSIZE==Q.front) { cout << "队列已满!"; return ERROR; } Q.base[Q.rear] = e; Q.rear = (Q.rear+1)%Q.MAXSIZE; return OK; } Status DeQueue(SqQueue& Q,ElemType& e) //出队 { if(Q.front==Q.rear) { cout << "队列为空!"; return ERROR; } e = Q.base[Q.front]; Q.base[Q.front] = 0; Q.front = (Q.front+1)%(Q.MAXSIZE-1);//总人数为MAXSIZE-1 return OK; } int main() { int n,m,i=1; SqQueue Q; ElemType e; cout << "请输入n个人(n<=100):"; do { cin >> n; if(n>100 || n<1) { cout << "输入人数错误!请重新输入:"; } }while(n>100 || n<1); InitQueue(Q,n); while(i<=n)//入队操作 { EnQueue(Q,i); i++; } cout << "\n此时的序列顺序为:"<<endl; QueueTraverse(Q); cout << "\n请输入第m个人出队(1<=m<=n):"; do { cin >> m; if(m>n || m<1) { cout << "m输入错误!请重新输入:"; } }while(m>n || m<1); cout << endl; int Count = n;//用来记录剩下的人数 while(Count != 1) { i = 1;//i用来控制是第几个人报数 while(i != m)//当i的值不等于m的值时 { Q.front = (Q.front+1)%(Q.MAXSIZE-1);//总人数为MAXSIZE-1 if(Q.base[Q.front] != 0)//当此时不为0的话,i++用来控制第几个人 { i++; } } DeQueue(Q,e); while(Q.base[Q.front] == 0)//当此时为0的时候,循环找到下一个不为0的位置 { Q.front = (Q.front+1)%(Q.MAXSIZE-1); } cout << "序号:" << e << "出局!\n"; Count--; } DeQueue(Q,e); cout << "\n最后一个是:" << e << endl; return 0; }
1. 有n个人围成一圈,从第1个人开始,1,2,…,m报数,报至m出局,余下的人继续从1,2,…,m报数,重复之前的流程,要求:求出被淘汰编号的序列,及最后剩下的一人是原来的第几号?(要求:用循环队列解决该问题。)