题目描述
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次的时候,不往队列后添加了,直接删掉最前面的那个,这就是那个被杀死的
然后继续
我感觉用队列的话,还是挺方便的;