您的位置:首页 > 其它

丢手帕问题(约瑟夫问题-数组实现)

2018-03-31 22:04 344 查看
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。 
例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。输入两个整数N,M 
比如 6 5 
输出被杀掉的人的序号 
比如5 4 6 2 3 1 
再比如: 
输入 11 3 
输出 3 6 9 1 5 10 4 11 8 2 7
分析:这里用数组实现约瑟夫问题。用数组从1开始,记录每个人是否存活,当计数器大于人数n时模n置1。每当遍历到活人时报数加一,当报数为m时杀人,报数置0。当仅剩一人时,报数到m则计数器指向此人。按照顺序输出即可。
代码:#include<iostream>
#define MAX 1000
using namespace std;
int main()
{
int people[MAX] = {0};
int n, m;
int num = 0;
int dead = 0;
cin >> n >> m;
int i = 1;
while(1)
{
if(i > n)
i %= n;
if(people[i] == 0)
num++;
if(dead != n - 1 && num == m)
{
num = 0;
dead++;
people[i] = 1;
cout << i << ' ';
}
if(dead == n - 1 && num == m)
{
cout << i << endl;
break;
}
i++;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  蓝桥杯 算法