先来举个例子吧,六个人围一圈。
题目背景
约瑟夫是一个无聊的人!!!
题目描述
n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……依次类推,直到所有的人都出圈,请输出依次出圈人的编号.
输入格式
n m
输出格式
出圈的编号
对于约瑟夫环 用队列解决是再合适不过的,下面附上AC代码
手写队列版
#include<iostream>
using namespace std;
struct Queue{
int front=-1,rear=-1;
int value[100010];
void push(int x){ value[++rear]=x; }
void pop(){ front++;}
int get_front(){ return value[front+1];}
int get_rear(){ return value[rear];}
int size(){ return rear-front;}
bool empty(){
if(front==rear) return true;
else return false;
}
};
int main(){
int n,k,num=1;
Queue qq;
cin>>n>>k;
for(int i=1;i<=n;i++) qq.push(i);
while(!qq.empty()){
if(num!=k){ qq.push(qq.get_front()); qq.pop(); num++; }
else { cout<<qq.get_front()<<" "; qq.pop();num=1;}
}
return 0;
}
STL版本
#include<iostream>
#include<queue>
using namespace std;
int main(){
int n=0,m=0,a=0;
queue<int> q;
cin>>n>>m;
for(int i=1;i<=n;i++){
q.push(i);
}
while(!q.empty()){
for(int i=0;i<m-1;i++){
q.push(q.front());//将前m-1个人压到队尾,并出队
q.pop();
}
cout<<q.front();//打印出队人编号
q.pop();//出队
}
return 0;
}