P1996 约瑟夫问题
题目描述
n个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 11 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
输入格式
输入两个整数 n,m。
输出格式
输出一行 n 个整数,按顺序输出每个出圈人的编号。
输入输出样例
输入 #1
10 3
输出 #1
3 6 9 2 7 1 8 5 10 4
说明/提示
1001≤m,n≤100
题解:
用队列模拟出圈,直到所有人都出圈为止。
Code:
#include<bits/stdc++.h>
using namespace std;
queue <int> q;//定义队列
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
q.push(i);//入队
}
int cnt=1,x;
while(!q.empty()){
if(cnt==m){//当数到m
cout<<q.front()<<" ";//输出队头元素
q.pop();//出队
cnt=1;//初始化cnt
}
if(cnt!=m){
cnt++;
x=q.front();
q.push(x);
q.pop();
}
}
}