约瑟夫问题(洛谷题面

题目

题目描述:

nn 个人围成一圈,从第一个人开始报数,数到 mm 的人出列,再由下一个人重新从 11 开始报数,数到 mm 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。

注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰 n1n-1 名小朋友,而该题是全部出圈。

输入格式:

输入两个整数 n,mn,m

输出格式:

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

数据范围与说明:

1m,n1001 \le m, n \le 100

输入输出样例 #1

输入:

1
10 3

输出:

1
3 6 9 2 7 1 8 5 10 4

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,m;
scanf("%d %d",&n,&m);
queue<int> q;
for(int i=1;i<=n;i++){
q.push(i);
}
int cnt=1;
while(!q.empty()){
if(cnt==m){
cout<<q.front()<<" ";
q.pop();
cnt=1;
}else{
cnt++;
q.push(q.front());
q.pop();
}
}
return 0;
}