题目 : 约瑟夫问题
题目描述
n个人想玩残酷的死亡游戏,游戏规则如下:n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。请输出最后一个人的编号。
输入
多组测试数据,输入n和m的值,m,n都在1-150之间
输出
输出胜利者的编号。
样例输入
5 3
1 1
样例输出
4
1
#include<iostream>
#include<cstring>
const int maxn = 155;
using namespace std;
bool a[maxn];
int main()
{
ios::sync_with_stdio(false);//这个是小妹的习惯,大家忽略就好了
cin.tie(0);cout.tie(0);
int n,m;//n个人,数到第m个人出圈
while(cin>>n>>m) //因为要多组输入,所以用while来实现
{
int pos=0,vis=0,count=0; //pos是来记录出圈的人数的,也就是死亡人数,vis是记录每个人的位置,count就是一个计数器
memset(a,0,sizeof(a));//初始化bool型数组
do
{
vis++;//枚举圈中所有人的位置
if(vis==n+1) vis=1;//因为他们站的是一个环形
if(a[vis]==false) count++;//这个位置的人没有出圈就用false来表示并且让计数器+1
if(count==m)
{
count=0;
a[vis]=true;
pos++;
}
if(pos==n) cout<<vis<<endl;//如果你的出圈人数正好等于n就打印出最后出圈的人,也就是胜利者
}
while(pos!=n);
}
return 0;
}