犹太历史学家弗拉维奥·约瑟夫在他的日记中提到过这么一个问题:他和他的40个战友被罗马军队包围在洞中。它们讨论是自杀还是投降,最终决定采用抽签的方式决定自杀的顺序。算法是这样的:所有人站成一圈,依次报数从1到3,每报到3的则自杀,下一个再从1开始报数。这样,所有人会依次自杀,直到最后一个。那最后一个死不死又有谁知道呢?那么站的位置就显得很重要了,到底站在哪个位置才能最后一个死呢?这便衍生成了一个计算机中的算法问题。
为了更加突出的说明这一问题,请看下面的图,改图内圈数字表示站立下标,外圈数字表示死亡顺序。
可见当有10个人,报数为3的人死亡时,站在4号位的最后可以存活。这一问题可以模拟到计算机程序中。
解决思路:首先很容易想到的便是采用链表的方式来处理,有一个首位相连的链表,每个节点里面存储了自己的下标并指向下一个节点的地址,最后一个节点指向首节点。根据这一思路,我们可以先创建一个约瑟夫环如下代码:
struct Jospher{
int index;
Jospher* next;
Jospher(int i){
this->index = i;
}
}; //先定义一个结构体(类)存储每个节点的信息
void creatRing(Jospher* head, int ringSize){
//传入首节点和需要创建的环的节点总数
Jospher* pointer = head;
for(int i = 1; i < ringSize; i+