约瑟夫环问题

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

#include <iostream>
using namespace std;
#define MAXNUM 20   //最大成员个数 
/*
* 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;
}