循环队列解决约瑟夫问题

n个人围成一圈,从第1个人开始,12,…,m报数,报至m出局,余下的人继续从12,…,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 << "
此时的序列顺序为:"<<endl;  
    QueueTraverse(Q);  
    cout << "
请输入第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 << "出局!
";  
        Count--;  
    }  
    DeQueue(Q,e);  
    cout << "
最后一个是:" << e << endl;  
    return 0;  
}  

1.  n个人围成一圈,从第1个人开始,12,…,m报数,报至m出局,余下的人继续从12,…,m报数,重复之前的流程,要求:求出被淘汰编号的序列,及最后剩下的一人是原来的第几号?(要求:用循环队列解决该问题。)

原文地址:https://www.cnblogs.com/luoyanghao/p/6197664.html