约瑟夫问题
有n 个人,编号为 1~n,按顺序围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,以此类推,直到所有的人都出圈,请依次输出出圈人的编号。
用队列来模拟报数。方法是反复排队,从队头出去,然后重新排到队尾,每一轮数到 m 的人离开队列。
#include <bits/stdc++.h>
using namespace std;
const int N = 10005;
struct myqueue{
int a[N];
int head;
int tail;
void init(){head = 0, tail = -1;}
int size(){return tail - head + 1;}
void push(int data){a[++tail] = data;}
int front(){return a[head];}
void pop(){head++;}
};
myqueue que;
int main(){
int n,m;
cin>>n>>m;
que.init();
for(int i = 1;i <= n;i++) que.push(i);
while(que.size() != 0){
for(int i = 1;i < m;i++){
que.push(que.front());
que.pop();
}
cout << que.front() << " ";
que.pop();
}
cout << endl;
return 0;
}