约瑟夫问题(数组实现)

据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

约瑟夫问题是典型的循环链,但也可用数组实现。

static void Jproblem(int n, int k)

{

int[] array = new int[n];

Console.WriteLine("initial the array");

for (int j = 0; j < n; j++)

{

array[j] = 1;

}



bool end = false;

int i = 1;

int currentPostion = 0;

while (!end)

{

if (array[currentPostion] == 1)

{

i++;

}

if (currentPostion == n - 1) // if max, then go to 0

{

currentPostion = 0;

}

else

{

currentPostion++;

}



if (i > k)

{

array[currentPostion] = 0;//delete it

i = 1;

}

// sum

int sum = 0;

foreach (int a in array) // 如何sum小于K,说明程序应该结束了

{

sum += a;

}

if (sum < k)

{

end = true;

}

}

for (int j = 0; j < n; j++)

{

if (array[j] == 1)

{

Console.WriteLine(j);

}

}
原文地址:https://www.cnblogs.com/zhangjiang/p/2396125.html