• 约瑟夫环问题


    题目描述

    约瑟夫问题是一个非常著名的趣题,即由n个人坐成一圈,按顺时针由1开始给他们编号。然后由第一个人开始报数,数到m的人出局。现在需要求的是最后一个出局的人的编号。

    给定两个int nm,代表游戏的人数。请返回最后一个出局的人的编号。保证n和m小于等于1000。

    测试样例:
    5 3
    返回:4
    ----------------------------------------------------------------------------------------------------------------------------------------------------------

    据说著名犹太历史学家Josephus在罗马人占领了乔塔帕特之后,39个犹太人与Josephus及他的朋友躲到山洞,39个犹太人决定宁愿死都不要被敌人抓到,于是决定了一种自杀的方式,41个人排成一个圈子,
    由第一个人开始报数,报到3的人就自杀。然后再由下一个人开始重新报1,报到3的再自杀,这样再一直下去,直到最后一个人,那个人就可以自己决定自己的命运。这就是著名的约瑟夫问题。

    那么怎样才能决定自己的命运呢?就是一开始41人时就要占据有利的位置。那么哪个位置是有利的位置? 不说了,直接上代码!
     1 class Joseph {
     2 public:
     3     int getResult(int n, int m) {
     4         vector<int> a(n);
     5         int cur = 0;
     6         int pre = n-1;
     7         int count = 0;
     8         int allPeopleCount = n;
     9         int i;
    10          
    11          
    12         for(i = 0; i < n-1;i++){
    13             a[i] =  i+1;
    14         }
    15          
    16         while(allPeopleCount){
    17          
    18             if(++count >= m)
    19             {
    20                 allPeopleCount--;
    21                 count = 0;
    22                 a[pre] = a[cur];    //类似指针
    23                  
    24             }  
    25             else
    26                 pre = cur;
    27             cur =  a[cur];
    28         }
    29              
    30         return cur+1;
    31          
    32          
    33     }
    34 };

    此方法比较字节用数组模拟环形链表,在一个一个删除节点:

    另一种方法就是找出递归的关系式我们已知递归的出口是getResult(1,m) = 1;  m代表报到那个数字自杀的人

    通过推到我们可以知道 getResult(i,m) = (getResult(i-1,m)+m-1)%i+1; 这是用递归就很简单了。

    class Joseph {
    public:
        int getResult(int n, int m) {
             
            if(n == 1)
                return 1;
            return (getResult(n-1,m)+m-1)%n + 1;
        }       
    };
  • 相关阅读:
    python之 json里字典中的value去重
    matlab 中出现的错误 原因及解决办法
    利用matlab将二进制小数转换为十进制小数
    Git学习笔记
    关于升级OSX10.10 Yosemite后Matlab无法启动的解决办法
    编译macvim报错的macvim failed to build on 10.9 because of x11解决办法
    安装pydelicious遇到的一些问题
    用VerilogHDL编写的可调占空比的PWM波形设计
    精确了13倍是什么意思?
    知乎周刊之程序人生概要
  • 原文地址:https://www.cnblogs.com/wannable/p/5809873.html
Copyright © 2020-2023  润新知