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

转载于:https://www.cnblogs.com/luoyanghao/p/6197664.html

循环队列解决约瑟夫问题相关推荐

  1. 有n个人围成一圈,从第1个人开始,1、2、3报数,报至3出局,余下的人继续从1、2、3报数,问:最后剩下的一人是原来的第几号?同时求出被淘汰编号的序列。(要求:用循环队列解决该问题。)

    1. 有n个人围成一圈,从第1个人开始,1.2.3报数,报至3出局,余下的人继续从1.2.3报数,问:最后剩下的一人是原来的第几号?同时求出被淘汰编号的序列.(要求:用循环队列解决该问题.) 这是一道 ...

  2. 使用队列解决约瑟夫环问题

    题目描述: 首先,让小朋友们围成一个大圈.然后,随机指定一个数m,让编号为0的小朋友开始报数.每次喊到m-1的那个小朋友要出列唱首歌,并且不再回到圈中,从他的下一个小朋友开始,继续0-m-1报数-这样 ...

  3. c语言 队列 游戏,循环队列实现约瑟夫游戏(C语言版)

    #include #include typedef struct node { int *base; int front; int rear; }Node; /* 思路: *使用一个顺序循环队列来存放 ...

  4. 用java解决约瑟夫循环问题,Java实现循环列表解决约瑟夫环问题

    约瑟夫环:共有n个人围成一圈,从1开始报数,数到m的人出圈,求最后幸运者序号?? 下面用Java实现循环列表解决这个问题: package com.iteye.ljmdbc7a; import jav ...

  5. 循环队列解决舞会问题(C++实现)

    [题目描述] 假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队.跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴.规定每个舞曲能有一对跳舞者.若两队初始人数不相同,则较长的那一队中未配对者 ...

  6. 基于数组实现循环队列(基于Java实现)

    title: 基于数组实现循环队列(基于Java实现) tags: 数组 循环队列 基于数组实现循环队列的方法原理: 我们在用数组实现队列的时候,发现当tail = n时,就会有数据搬移的操作,这样一 ...

  7. 环形队列的输出_循环队列的基本操作详细讲解

    实验学时: 2 实验类型: (设计型) 一.实验目的 1. 理解并掌握队列的逻辑结构和顺序存储结构,了解循环队列的特点: 2. 掌握循环队列中基本操作的相关算法: 3. 编程实现相关算法: 4. 学会 ...

  8. 循环队列(队列头尾相接的顺序存储结构)

    循环队列(头尾相接的循环) 1.引出循环队列 解决上一篇博客当中:队列顺序存储结构出现的问题 现在通过将 rear 指针重新指向下标为 0 的位置,来解决上述问题 rear+1之后跑到了数组末尾后一位 ...

  9. 【Java 数据结构 算法】宁可累死自己, 也要卷死别人 6 循环队列

    [Java 数据结构 & 算法]⚠️宁可累死自己, 也要卷死别人 6⚠️ 循环队列 概述 循环队列 循环队列实现 改变队列大小 enqueue 方法 dequeue 方法 main 完整代码 ...

最新文章

  1. matlab求adc信号的信噪比,关于ADC的信噪比 - pengyouxiaohui的日志 - EETOP 创芯网论坛 (原名:电子顶级开发网) -...
  2. php数据结构链表代码,数据结构之线性表——链式存储结构之单链表(php代码实现)...
  3. STM32开发 -- 系统架构
  4. 南昌大学c语言大作业,南昌大学计算机C语言答案2
  5. MATLAB中如何生成指定范围的随机整数向量
  6. TkMybatis 笔记
  7. Awesome Go
  8. JavaWeb那些事儿(一)--为什么做java的web开发使用struts2,springMVC和spring这样的框架
  9. 面向对象程序设计课第四次作业
  10. 电信基础设施共建共享
  11. 51单片机中断程序大全
  12. 软件程序开发步骤有哪些?如何简单制作手机App?
  13. easyui filebox文件类型判断
  14. 框架尺寸调整属性NORESIZE
  15. 降维打击 Dimensionality reduction attack
  16. Opencv中的颜色检测
  17. 两个各四只青蛙过河java_Java实现 LeetCode 403 青蛙过河
  18. 微信小程序 实现报表(表格)双指缩放功能
  19. 两台电脑之间怎么互相传文件
  20. 厦大2021届大一小学期C语言作业1 数组+字符串+指针+位操作

热门文章

  1. linux系统udp通信程序,Linux UDP socket编程(UDP通讯模型) | C/C++程序员之家
  2. java链表实现_数据结构——基于java的链表实现(真正理解链表这种数据结构)...
  3. 【spring-boot】restfull api 返回值中,去掉 null 值
  4. 【CKEditor】上传图片接口接收不到CKEditorFuncNum参数
  5. 微型计算机接口期末,最新大学微机原理与接口技术期末试题及答案
  6. 猴子选王c语言链表程序代码,C语言程序设计-猴子选大王[链表应用]
  7. 计算机系统操作工培训视频,计算机系统操作工培训第三篇.ppt
  8. mysql 5.1.73.tgz下载_Linux下安装python,mysql
  9. python爬取素材图片代码_基于Python爬取素材网站音频文件
  10. python public_【速记速学】Python类的定义,属性,方法,访问性