原題連結:https://www.luogu.com.cn/problem/P1996
題意解讀:約瑟夫問題是佇列的典型應用。
解題思路:
n個人圍圈報數,可以直接基於陣列實現迴圈佇列操作,再定義額外陣列記錄每個人是否已經出圈即可。
更直觀的做法,定義佇列,初始放入1~n,
然後重複n次,每次從1~m報數,
如果報數到m,直接出隊,
如果報數其他值,出隊後加入到佇列尾部,保持環狀。
100分程式碼:
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int n, m;
queue<int> q;
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i++) q.push(i);
while(n--)
{
for(int i = 1; i <= m; i++)
{
if(i != m)
{
q.push(q.front());
q.pop();
}
else
{
cout << q.front() << " ";
q.pop();
}
}
}
return 0;
}