P1996 约瑟夫问题
循坏队列解决问题
#include <iostream>
#include<cstdio>
#include <string.h>
#include <queue>
using namespace std;
int main()
{
int n,m,x;
scanf("%d%d",&n,&m);
queue<int> Q;//建立队列
int i = 1;
//每个人编号入队
for(int j = 1;j <= n;j++){
Q.push(j);
}
//开始报数
while(Q.size() > 1){ //队内人数大于1
x = Q.front();
if(i != m){ //没报到m,队头元素重新入队,i++继续报数
Q.push(Q.front());
Q.pop();
i++;
}
else{ //报到m,先输出再出队,i=1重新报数
cout << Q.front() << " ";
Q.pop();
i = 1;
}
}
cout << Q.front() << endl; //队内剩余一人,输出
return 0;
}
PS:
类似题目(顺序表(数组)解决):圈中的游戏(约瑟夫问题)