原题链接:约瑟夫问题 - 洛谷
目录
1.题目描述
2.思路分析
经典的约瑟夫问题,可以用队列解决。
先把编号1~n压入队列,定义一个cnt,并且初始化为1记录当前小朋友数到了几,在队列非空的情况下,先用一个变量t将队头存储,并且弹出。
当cnt==m时(即当前小朋友数到m),输出t(队头),并将cnt赋值成1便于接下来的数数。
cnt!=m时,将t压入队列(也就是让t在队尾),并且cnt++(下一个小朋友接着数数)
3.代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m; cin >> n >> m;
queue<int> q;
for (int i = 1; i <= n; i++) q.push(i);
int cnt = 1;
while (!q.empty()) {
int t = q.front(); q.pop();
if (cnt == m) {
cout << t << " ";
cnt = 1;
}else {
q.push(t);
cnt++;
}
}
return 0;
}