zoukankan      html  css  js  c++  java
  • 约瑟夫环

    贴上一些百度百科的内容

    问题来源:

    据说著名犹太历史学家 Josephus有过下面的故事:在罗马人占据乔塔帕特后。39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈。由第1个人開始报数,每报数到第3人该人就必须自杀。然后再由下一个又一次报数,直到全部人都自杀身亡为止。

    然而Josephus 和他的朋友并不想遵从。首先从一个人開始。越过k-2个人(由于第一个人已经被越过),并杀掉第k个人。

    接着。再越过k-1个人。并杀掉第k个人。这个过程沿着圆圈一直进行,直到终于仅仅剩下一个人留下,这个人就能够继续活着。问题是,给定了和,一開始要站在什么地方才干避免被处决?Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置。于是逃过了这场死亡游戏。



    赋上java实现

    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 约瑟夫环
     * 
     * 
     * 据说著名犹太历史学家 Josephus有过下面的故事:
     * 在罗马人占据乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,
     * 39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式。
     * 41个人排成一个圆圈,由第1个人開始报数,每报数到第3人该人就必须自杀,
     * 然后再由下一个又一次报数,直到全部人都自杀身亡为止。
     * 然而Josephus 和他的朋友并不想遵从。
     * 
     * 首先从一个人開始,越过k-2个人(由于第一个人已经被越过),并杀掉第k个人。

    * 接着。再越过k-1个人,并杀掉第k个人。

    * 这个过程沿着圆圈一直进行,直到终于仅仅剩下一个人留下,这个人就能够继续活着。

    * 问题是,给定了和,一開始要站在什么地方才干避免被处决? * Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置。 * 于是逃过了这场死亡游戏。 * * @author * */ public class Josephus {     private int[] josephus(List<Integer> input,int step){         int n = input.size();         int[] output = new int[n];         int curLen = n;         int curPosition = step;         int index = 0;         for(int i = 1;i<=n;i++){             while(curPosition>curLen){                 curPosition=curPosition-curLen;             }                          output[i-1]=input.get(curPosition-index-1);             System.out.println(output[i-1]);             input.remove(curPosition-index-1);             index++;                          curPosition += step;             if(curPosition>curLen){                 curPosition=curPosition-curLen;                 curLen = input.size();                 index = 0;             }         }                  return output;              }          public static void main(String[] args) {         List<Integer> input = new ArrayList<Integer>();         for(int i = 1;i<=41;i++){             input.add(i);         }         Josephus jp = new Josephus();         int[] output = jp.josephus(input, 4);         StringBuilder sb = new StringBuilder();         for(int i = 0;i<output.length;i++){             sb.append(output[i]).append(" ");         }         System.out.println(sb.toString());     } }



  • 相关阅读:
    Nginx rewrite模块深入浅出详解
    一个ip对应多个域名多个ssl证书配置-Nginx实现多域名证书HTTPS
    nginx: [emerg] getpwnam(“www”) failed错误
    mysql5.7 启动报发生系统错误2
    obv15 实例6:如果K线柱过多,ZIG将发生变动,导致明显的OBV15指标被隐藏!
    obv15 案例4,待日后分析
    稳定
    教你识别指标骗局:以某家捕捞季节和主力追踪为例讲解
    C++ 语句
    C++ 表达式
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7019463.html
Copyright © 2011-2022 走看看