用C++解决约瑟夫环的问题

犹太历史学家弗拉维奥·约瑟夫在他的日记中提到过这么一个问题:他和他的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+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值