题目:约瑟夫问题
n个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到m的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
输入格式
输入两个整数n,m。
输出格式
输出一行n个整数,按顺序输出每个出圈人的编号。
输入样例
10 3
输出样例
3 6 9 2 7 1 8 5 10 4
题解
本题可以用链表+模拟解决,模拟每轮游戏的过程并及时让数到m的人出局。代码如下:
#include<bits/stdc++.h>
using namespace std;
list<int>l;//定义链表
list<int>::iterator it,tmp;
//定义迭代器,it指向当前位置
int main()
{
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++)
l.push_back(i);
//输入,把编号加入链表
it=l.begin();//游戏开始指向第一个人
for(int i=1;i<=n;i++) //进行n轮游戏,每轮淘汰一人
{
for(int j=1;j<m;j++) //模拟数数过程
{
it++;//指向下一个人
if(it==l.end()) it=l.begin();
//如果指向最后一个人还未结束,指向第一个人
} cout<<(*it)<<" ";//输出被淘汰的人的编号
tmp=it++;//tmp是临时迭代器,用于删除被淘汰的人
if(it==l.end()) it=l.begin();
l.erase(tmp);//删除被淘汰的人
}
return 0;
}