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

  • 相关阅读:
    mojo 接口示例
    MojoliciousLite: 实时的web框架 概述
    接口返回json
    centos 6.7 perl 版本 This is perl 5, version 22 安装DBI DBD
    centos 6.7 perl 5.22 安装DBD 需要使用老的perl版本
    商业智能改变汽车行业
    商业智能改变汽车行业
    读MBA经历回顾(上)目的决定手段——北漂18年(48)
    perl 升级到5.20版本
    Group Commit of Binary Log
  • 原文地址:https://www.cnblogs.com/luoyanghao/p/6197664.html
Copyright © 2011-2022 走看看