约瑟夫算法

来源:互联网 发布:广西广电网络收费套餐 编辑:程序博客网 时间:2024/06/05 12:45

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


下面就用代码来实现下joseplus算法:

import java.util.ArrayList;import java.util.List;/** * Created by Administrator on 2016/6/13. */public class Josephus {    private static  List<Integer> result = new ArrayList<Integer>();    public static void main(String[] args) {        List<Integer> start = new ArrayList<Integer>();        for(int i=1;i<=10;i++){            start.add(i);        }        josephus(start);        System.out.println(result);    }    /**     * 采用递归算法     * @param start     */   public static void josephus(List<Integer> start ) {       System.out.println(start+"=========");       //存放左边元素       List<Integer> left = new ArrayList<Integer>();       //存放右边元素       List<Integer> right = new ArrayList<Integer>();        int k=3;//当报数到3的时候,退出,然后从下一个元素开始报数        for(int i=1;i<=start.size();i++){             if(i<k){//小于报数k的存入左边元素                 left.add(start.get(i-1));             }else if(i>k){//大于报数k的存入右边元素                 right.add(start.get(i-1));             }else{//等于报数k的存入结果集中                 result.add(start.get(i-1));             }        }       //清空原集合       start.clear();       //加载新集合       start.addAll(right);       start.addAll(left);       //当人数小于3的时候,就退出递归       if(start.size()<3){           System.out.println(start);       }else{//递归调用           josephus(start);       }    }}
测试结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]=========[4, 5, 6, 7, 8, 9, 10, 1, 2]=========[7, 8, 9, 10, 1, 2, 4, 5]=========[10, 1, 2, 4, 5, 7, 8]=========[4, 5, 7, 8, 10, 1]=========[8, 10, 1, 4, 5]=========[4, 5, 8, 10]=========[10, 4, 5]=========[10, 4][3, 6, 9, 2, 7, 1, 8, 5]

这样就很容易搞定了简单的约瑟夫算法,当然还可以有很多扩展

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 新车漆被刮掉了怎么办 新车被别人撞了怎么办 新买的车被撞了怎么办 临时牌掉了一张怎么办 车子在停车场被刮了怎么办 金毛不想养了怎么办 gta5老是掉线怎么办ps4 养狗身上有味道怎么办 身上有异味怎么办%3f 花钱花多了后悔怎么办 想去当兵有纹身怎么办 爸家里人欺负我妈怎么办 部队退伍登记表填错怎么办 新手程序员第一次做项目怎么办 十六岁月经量少怎么办 大姨妈第一天痛怎么办 月经第一天很疼怎么办 神器挑战任务放弃了怎么办 内蒙古森林武警改革新兵怎么办 手挨打了有点肿怎么办 征兵过程中身份证号重复怎么办 去当兵身上有纹身怎么办 武警警卫部队改革新兵怎么办 肾结石3mm很痛怎么办 剖腹产第6天肾结石痛怎么办 左肾5mm结石怎么办 肾结石手术后反复发烧怎么办 百世快递会被退回怎么办 身份证被列入黑名单了怎么办 顺丰寄方客户要求退回快递费怎么办 蛋蛋被皮筋弹肿了怎么办 人肌肉里的绦虫卵怎么办 鞋子前面踢坏了怎么办 猫割完蛋蛋流东西怎么办 北京怡瑞被骗后怎么办 玩滑板睾丸碎了怎么办 雄鸽不会踩蛋怎么办 玩滑板蛋碎了怎么办 精子在精囊满了怎么办 孩子的睾丸一大一小怎么办 肾阳虚早射该怎么办