您的位置:首页 > 编程语言 > Java开发

java趣味算法(一)——约瑟夫问题

2017-10-27 13:16 501 查看

用java实现约瑟夫问题

据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。

下面的代码实现从M个人中每次数N次,每次死一个人,然后从下一个人开始数N次,直到留下最后一个人

import java.util.ArrayList;
import java.util.List;

/**
* 丢手绢,丢炸弹游戏,  ( 约瑟夫问题 )
* 规则:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。
* Created by wangzhi on 2017/10/27 0027.
*/
public class Algorithm {

/**
* 炸弹丢到哪个位置
* @param sum        总人数
* @param interval   从第一个开始数
* @return
*/
public static int quyu(int sum, int interval){
if(sum < interval){
interval = interval % sum;
}
if(interval == 0){
return sum;
}
return interval;
}

/**
* 初始化人数
* @param sum
* @return
*/
public static List init(int sum){
List list = new ArrayList();
for(int i=0;i<sum;i++){
list.add((i+1)+"号");
}
for(int i=0;i<sum;i++){
System.out.println("初始化:我是"+list.get(i));
}
System.out.println("游戏开始!!");
return list;
}

/**
* 移除被炸死的那个人
* @param list
* @param point
*/
public static void removeHanderkerchief(List list,int point){
System.out.print("当前人数:"+list.size()+".刚才炸弹传递到第"+point+"个人,"+list.get(point-1)+"不幸被炸死");
list.remove(point-1);
System.out.println("。。。。。。收尸完毕。剩余人数:"+list.size());
}

/**
* 重置数组
* @param oldList
* @param point
* @return
*/
public static List resetList(List oldList,int point){
List list = new ArrayList();

for(int i = point;i < oldList.size(); i++){
list.add(oldList.get(i));
}
for(int i = 0 ; i < point;i++){
list.add(oldList.get(i));
}
return list;
}

/**
* 游戏开始
* @param size
* @param interval
*/
public static void  handkerchief(int size, int interval){
if(size<1){
System.out.println("人数至少2人以上才能进行游戏。。。");
return;
}
List list = init(size);
int count = size;
int i =1;
while(list.size()>1){
System.out.println("第"+i+"回合开始。。。");
int point = quyu(count,interval);
removeHanderkerchief(list,point);
list = resetList(list,point-1);
System.out.println("炸弹从"+list.get(0)+"开始数");
i++;
count--;
System.out.println("");
}
System.out.println("*******************************************");
System.out.println("恭喜"+list.get(0)+"赢得游戏,获得炸弹人称号!!");

}

public static void main(String[] args) {
handkerchief(120,2);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法