C++解决猴王问题(约瑟夫环问题)

目录

问题介绍:

题目一:选猴王

题目二:排队kill问题、海盗抢宝藏问题、万能公式的推导

求解思路:

特例情况一:

特例情况二:

普遍情况:


问题介绍:

讲一个比较有意思的故事:约瑟夫是犹太军队的一个将军,在反抗罗马的起义中,他所率领的军队被击溃,只剩下残余的部队40余人,他们都是宁死不屈的人,所以不愿投降做叛徒。一群人表决说要死,所以用一种策略来先后kill所有人。
于是约瑟夫建议:每次由其他两人一起kill一个人,而被kill的人的先后顺序是由抽签决定的,约瑟夫有预谋地抽到了最后一签,在kill了除了他和剩余那个人之外的最后一人,他劝服了另外一个没死的人投降了罗马。

题目一:选猴王

有n只猴围成一圈,从1开始报数,数到m的就离开。直到最后一只猴,这只猴就是猴王

如n=5 m=3 最后得到4。

先贴代码:

#include <iostream>
#include <list> //写明头文件
using namespace std;
int main()
{
    int n,m;
    cin>>n>>m; //由终端输入:总数n  查到第m个删除
    list<int> monkeys;    //创建一个list列表
    for(int i=1;i<=n;i++)   //用for循环将数值写入list列表
    {
        monkeys.push_back(i);
    }
    list<int>::iterator it=monkeys.begin();        
    //当个数=1的时候停止  所以>1的时候循环
    while(monkeys.size()>1){
        for(int i=1;i<m;i++){   
            it++;
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值