约瑟夫环问题

另附维基百科(https://zh.wikipedia.org/wiki/%E7%BA%A6%E7%91%9F%E5%A4%AB%E6%96%AF%E9%97%AE%E9%A2%98)
约瑟夫问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。
人们站在一个等待被处决的圈子里。 计数从圆圈中的指定点开始,并沿指定方向围绕圆圈进行。 在跳过指定数量的人之后,执行下一个人。 对剩下的人重复该过程,从下一个人开始,朝同一方向跳过相同数量的人,直到只剩下一个人,并被释放。
问题即,给定人数、起点、方向和要跳过的数字,选择初始圆圈中的位置以避免被处决。

#include <iostream>
using namespace std;
#define//最大成员个数
/*
* Author lxywl09
* Date 2014/10/09
* 构建Josephus问题,即环形链表长度totalNum
* 从第startNum个开始,数到第step个删除,然后从下一个继续。
*/

void Josephus(int totalNum, int startNum, int step)
{
//totalNum是实际的个数
//从数组下标为 1 的位开始 到 totalNum 位结束
//用 Available[i]=0表示第i位已经被挑选出局 , Available[i]=1表示仍然可以参与游戏
int Available[totalNum];
for(int i=1; i<=totalNum; ++i)
Available[i] = 1; //游戏开始,先标记所有成员为1,即available

int num = totalNum;
int start = startNum;
int startIterator = start;
while(num>=1)
{
int count = 0; // 计数器

while(count<step)
{
if(Available[startIterator] == 1) count++;
if(count == step) break;
startIterator++;
if(startIterator == totalNum+1) startIterator = 1;//如果走到数组尾部,则将其指向数组的第1位,实现“环”的概念
}
cout<<startIterator<<endl;
Available[startIterator] = 0;
num--;
}


}
int main()
{
Josephus(5, 2, 3);
return 0;
}