贴上一些百度百科的内容
问题来源:
据说著名犹太历史学家 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()); } }