/*
15个教徒和非教徒在海上遇险,必须将一半的人投入大海,其余的人才能幸免于难,于是想了一个办法:30个人围城一圈,从第一个人开始依次报数,
每数到第九个人就把他丢入海中,如此循环进行直到仅余15个人为止。请问怎样排法,才能使每次投入大海的都是非教徒
*/
namespace ConsoleApplication1
{
class person
{
public bool isOnBoard { get; set; }
}
}
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
person[] persons = new person[30];
for (int i = 0; i < 30; i++)
{
persons[i] = new person();
persons[i].isOnBoard = true;
}
int leftCount = 30;
int currentID = -1; //上一次丢到海里的persons数组的索引
while (leftCount > 15)
{
int currentNumber = 0; //当前计数
for (int i = 1; i < 30; i++)
{
if (persons[(currentID + i) % 30].isOnBoard == true)
{
currentNumber++;
}
if (currentNumber == 9)
{
leftCount--;
currentID = (currentID + i) % 30;
persons[currentID].isOnBoard = false;
currentNumber = 0;
break;
}
}
}
//验证
//@:留在船上 +:丢到海里
for (int i = 0; i < 30; i++)
{
if (persons[i].isOnBoard == true)
{
System.Console.Write("@");
}
else
{
System.Console.Write("+");
}
}
System.Console.ReadLine();
}
}
}