1334:【例2-3】围圈报数

1334:【例2-3】围圈报数

时间限制: 1000 ms         内存限制: 65536 KB
提交数: 2253     通过数: 1482

【题目描述】

有nn个人依次围成一圈,从第11个人开始报数,数到第mm个人出列,然后从出列的下一个人开始报数,数到第mm个人又出列,…,如此反复到所有的人全部出列为止。设nn个人的编号分别为1,2,…,n1,2,…,n,打印出列的顺序。

【输入】

nn和mm。

【输出】

出列的顺序。

【输入样例】

4 17

【输出样例】

1 3 4 2

【提示】

n≤100n≤100。

【来源】

一本通

解析:

若是使用链表,这题的复杂程度无疑大大上升了,其实,我们完全用不着那么麻烦,一个个地报数,可以想象成一个队列,一个人报完数后,判断他所报的数是不是出局的数,如果是,直接弹出,但若不是,将其移动至队尾即可。

我们使用一个队列q进行模拟,在读取总人数和出局数字后,把这些人一个个地压入队列尾部。在使用队列之前,需要先加上头文件queue。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<queue>
 4 using namespace std;
 5 queue<int>q;
 6 int i,j,k;
 7 int n,m,now=1;
 8 using namespace std;
 9 int main()
10 {
11     scanf("%d%d",&n,&m);     //读取数据
12     for(i=1;i<=n;i++)            //初始化队列
13     q.push(i);
14     while(!q.empty())             //在队列不为空时继续模拟
15     {
16         if(now==m)
17         {
18             printf("%d ",q.front() );             //打印出局的人的编号
19             q.pop();                //出局
20             now=1;                  //初始化现在的数字
21         }
22         else
23         {
24             now++;
25             q.push(q.front());             //排至队尾
26             q.pop();;
27         }
28     }
29     return 0;
30 }

推荐相似题:

P1996 约瑟夫问题

原文地址:https://www.cnblogs.com/fuxiqi/p/10836856.html

时间: 2024-10-14 06:27:06

1334:【例2-3】围圈报数的相关文章

【例2-3】围圈报数

[例2-3]围圈报数 链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1334时间限制: 1000 ms         内存限制: 65536 KB [题目描述] 有n个人依次围成一圈,从第1个人开始报数,数到第m个人出列,然后从出列的下一个人开始报数,数到第m个人又出列,-,如此反复到所有的人全部出列为止.设n个人的编号分别为1,2,-,n,打印出列的顺序. [输入] n和m. [输出] 出列的顺序. [输入样例] 4 17 [输出样例]

使用循环链表实现约瑟夫环(围圈报数问题)

刚开始学C,碰到经典的围圈报数问题,现先将实现代码附下: #include<stdio.h>#include<stdlib.h> struct LNODE{ //链表定义 int data; struct LNODE *next;};typedef struct LNODE Lnode;typedef struct LNODE *LinkList;struct LNODE *create(int s[]) //创建单项循环链表{ struct LNODE *head=NULL,*p

围圈报数 c

#include<stdio.h> /*围圈报数*/ void left(int *p,int m,int n) { int i,j,count; i = j = count = 0; while(count < m-1) { if(*(p+i) != 0) j++; if(j == n) { *(p+i) = 0; count++; j = 0; } if(++i == m) i = 0; } } int main(void) { int x,y; scanf("%d%d&q

分别使用结构体和数组实现约瑟夫环(围圈报数问题之二)

前天用单循环链表实现了约瑟夫环问题,这种方法执行效率高.接下来用另外两种简单的方法实现之. 方法一:使用数组 void main() { int a[81],n,i,counter,num; //counter用来计算,num用来记录退出的人数 printf("please input total the number of person:"); scanf("%d",&n); for(i=0;i<n;i++) //为每个人编号,1~n { a[i]=

围圈报数

通过进栈出栈实现循环 #include<iostream> #include<queue> using namespace std; queue<int> q; int main(){ int n,m; cin>>n>>m; for(int i=1;i<=n;i++) q.push(i); int num=1; while(!q.empty()){ if(num==m){ cout<<q.front()<<"

C语言——N个人围成一圈报数淘汰问题

<一>问题描述: 有17个人围成一圈(编号为0-16),从第 0号的人开始从 1报数, 凡报到 3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止. 问此人原来的位置是多少号? <二>问题解决: 1.定义数组记录每个编号的状态(是否被淘汰): 2.在未被淘汰的人中检查是否数到3,若是,淘汰此人: 3.继续此过程至所有人被淘汰: <三>示例代码: 1 /* 2 16.有17个人围成一圈(编号为0-16),从第 0号的人开始从 1报数, 3 凡报到 3的倍数的人离

【C】n个人排成一圈报数的问题

问题来自:<C程序设计>(第四版)谭浩强 清华大学出版社 第291页 有n个人围城一圈,顺序排号.从第一个人开始报数(从1报到m),凡是报到m的人退出圈子,接着从循环队列的下一位开始报数(该数为1).问最后留下的是原来几号的那位. 注:本例为模拟题,按要求写程序即可. 示例代码: 1 #include <stdio.h> 2 3 int a[100]; 4 5 int find(int *a, int n, int m) 6 { 7 int counter = n; 8 int i

约瑟夫环问题(100围坐一圈报数,报3出圈)

100个人编号1-100,围坐一圈,从1号开始进行1,2,3报数,谁报数为3,就离开圈子,剩下的人继续报1,2,3,报数为3的出圈... 请写一段程序,计算最后一个留下来的人,他的编号 1 package com.ycl.test; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class Test1 { 7 public static void main(String[] args) { 8 int co

100灯泡围圈通亮问题

问题描述 有一百个灯泡,围成一个圈.每个灯泡有一个开关.如果一个灯被打开或者关闭,那么它相邻的两个灯泡状态会与原状态相反(亮变暗,暗变亮).请问是否存在一种操作方式可以把这一百个灯泡打开(都处于亮的状态). 分析 1.将一百个等编号[1-100],设置亮为1,暗为0,初始都为02.从1号灯泡开始打开,每次隔着前一次按下编号的两个灯按,N=3n-2 (n表示第n次打开灯泡),这样一直按下去,直到只有99号灯不亮 为止,一共需要按33次.3.这个时候唯一可以操作的就是把99号灯打开,那么98,100