//P1996约瑟夫回环问题
#include<bits/stdc++.h>
#define PII pair<int,int>
#define endl '\n'
using namespace std;
const int N = 2e5 + 10, M = 1e3 + 10;
void solve(int n, int m) {
//用栈解决
queue<int> qu;
int i=0, num=1;
int cnt=0;
/*在编写代码的时候应该先在纸上模拟一遍约瑟夫回环的过程,判断是否涉及到表头
如果涉及到表头则一定使用队列
应该先将所有元素插入队列中,然后再进行一个一个的排除,类似于循环队列
说到循环队列就会想到rear front,来进行一个循环的操作,但是链表编写起来太麻烦了
所以将刚刚出队的元素判断后重新push到队尾,依旧可以实现循环的操作*/
for (i = 1;i <= n;i++) {
qu.push(i);
}
//首先将所有元素push到队列中
while (!qu.empty()) {
int now = qu.front();
qu.pop();
if (num == m)
{
num = 1;
cout << now << " ";
}
else
{
qu.push(now);
num++;
}
}
//通过循环对队列的每个元素进行判断,循环结束的条件为队列为空
}
int main() {
int m, n;
cin >> n>> m;
solve(n, m);
}
洛谷P1996 约瑟夫回环问题
于 2024-04-04 11:15:59 首次发布