zoukankan      html  css  js  c++  java
  • 约瑟夫问题

    题目描述

    n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,

    再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。

    输入格式

    输入两个整数 n,m

    输出格式

    输出一行 n 个整数,按顺序输出每个出圈人的编号。

    输入输出样例

    输入 #1
    10 3
    输出 #1
    3 6 9 2 7 1 8 5 10 4
     1 #include<iostream>
     2 #include<queue>
     3 using namespace std;
     4 queue<int> a;
     5 int main(){
     6     int n,m;
     7     cin>>n>>m;
     8     if(n==0&&m==0){
     9         return 0;
    10     }
    11     for(int i=1;i<=n;i++){
    12         a.push(i);
    13     }    
    14     while(a.size()!=1){
    15         for(int i=0;i<m-1;i++){
    16             a.push(a.front());
    17             a.pop();
    18         }
    19         cout<<a.front()<<' ';
    20         a.pop();
    21     }
    22     cout<<a.front();        
    23     return 0;
    24 }

    用队列来解决约瑟夫问题

    就是先把这些编号入队

    然后把第一位添在队列最后,然后把第一位删掉,这就相当于报了一次数

    然后重复这个

    假如一共要报n次,那就重复这个n-1次

    然后第n次的时候,不往队列后添加了,直接删掉最前面的那个,这就是那个被杀死的

    然后继续

    我感觉用队列的话,还是挺方便的;

  • 相关阅读:
    《大型网站技术架构:核心原理与案分析》阅读笔记05
    软件体系结构(1)
    《大型网站技术架构:核心原理与案分析》阅读笔记04
    C/C++
    NIO蔚来自动驾驶实习生技术一面
    Intern Day86
    面试常考
    中国赛宝实验室C++技术一面
    Intern Day85
    Intern Day85
  • 原文地址:https://www.cnblogs.com/fate-/p/12292970.html
Copyright © 2011-2022 走看看