约瑟夫问题

Posted fate-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了约瑟夫问题相关的知识,希望对你有一定的参考价值。

题目描述

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次的时候,不往队列后添加了,直接删掉最前面的那个,这就是那个被杀死的

然后继续

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

 

以上是关于约瑟夫问题的主要内容,如果未能解决你的问题,请参考以下文章

约瑟夫问题Java环形单向链表代码实现

环形链表与约瑟夫问题的代码解决

约瑟夫问题的JAVA实现(借鉴别人的代码+自己分析理解)

看小朋友做游戏顿时解决了约瑟夫问题

java中约瑟夫环代码实现

年前最后一波装逼记一次阿里面试,我是如何用一行代码解决约瑟夫环问题的