约瑟夫环

贴上一些百度百科的内容

问题来源:

据说著名犹太历史学家 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());     } }



原文地址:https://www.cnblogs.com/gccbuaa/p/7019463.html