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());     } }



  • 相关阅读:
    微信浏览器内 h5 直接唤醒 app 之 微信开放标签 wx-open-launch-app
    HTML5之2D物理引擎 Box2D for javascript Games 系列 翻外篇--如何结合createJS应用box2d.js
    HTML5之2D物理引擎 Box2D for javascript Games 系列 第三部分之创建图腾破坏者的关卡
    HTML5之2D物理引擎 Box2D for javascript Games 系列 第二部分
    HTML5之2D物理引擎 Box2D for javascript Games 系列 第一部分
    写给“有钱大爷”、”美工殿下”、“前端文艺青年”的微信HTML5页面设计建议
    微信 JS-SDK Demo “分享信息设置” API 及数字签名生成方法(NodeJS版本)更新时间(2020-10-29)
    NodeJS让前端与后端更友好的分手
    “榕树下·那年”移动app ( hybrid ) 开发总结
    如何在移动端app中应用字体图标icon fonts
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7019463.html
Copyright © 2011-2022 走看看