zoukankan      html  css  js  c++  java
  • 循环队列解决约瑟夫问题

    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报数,重复之前的流程,要求:求出被淘汰编号的序列,及最后剩下的一人是原来的第几号?(要求:用循环队列解决该问题。)

  • 相关阅读:
    Cocos Creator之生命周期函数
    Cocos Creator之基本概念
    Cocos Creator之菜单栏和工具栏
    Cocos Creator之认识
    lvs nat模式+iptables实现fullnat
    k8s cpu绑定
    arp代理
    确定veth pair在容器和宿主机的对应关系
    k8s 滚动发布
    http长连接
  • 原文地址:https://www.cnblogs.com/luoyanghao/p/6197664.html
Copyright © 2011-2022 走看看