约瑟夫环 的 面向对象 解法

罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

如有疑问请参考:http://blog.fishc.com/1959.html

实现代码如下:

程序的入口

/Josephus/src/com/kodoyang/Josephus/Demo.java

package com.kodoyang.Josephus;

/**
 * ---------------------------------------------------------------------
 *
 * 在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,
 * 39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,
 * 41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,
 * 然后再由下一个重新报数,直到所有人都自杀身亡为止。
 * 然而Josephus和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,
 * 他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
 * ----------------------------------------------------------------------
 *
 * 网站上有很多实现了,我提供一种面向对象的实现
 * 把约瑟夫环看成一个正多边形,每个人占据顶点的位置
 * ----------------------------------------------------------------------
 *
 * 程序的入口类
 *
 * @author yuki
 *
 */
public class Demo {

    // 程序的入口
    public static void main(String[] args) {

        // 一共41个人
        final int N = 41;

        // 新建一个具有41条边的正多边形
        Ring r = new Ring(N);

        // 记录当前生存的人数
        int i = N;
        // 生存人数为零就结束循环
        while(i != 0){
            // 调用环的报数方法,返回真说明有点死亡,返回假说明无点死亡
            if( r.call() ){
                // 打印当前存活人数
                $("Survival : " + --i);
            }
        }

    }

    /**
     * 打印语句的封装
     * @param s
     */
    private static void $(String s){
        System.out.println("---------------------------" + s);
    }

}

/Josephus/src/com/kodoyang/Josephus/Vertex.java

定义将要循环自杀的犹太人的类

package com.kodoyang.Josephus;
/**
 * 构成环的顶点,它是可以不依赖于环独立存在的
 *
 * @author yuki
 *
 */
public class Vertex {

    // 唯一标识,会被构造方法初始化
    private int id;
    // 当前点所处的状态
    private boolean dead;

    /**
     * 构造方法
     * @param id
     */
    public Vertex(int id){
        this.id = id;
    }

    /**
     * 点被环调用了
     * @param num 环让它报的数
     * @return
     */
    public void act(int num) {
        // 报数
        System.out.println("id = " + id + ", num = " + num);
        // 如果报的数是2
        if(num == 2){
            // 当前点死亡
            System.out.println("......I am dead......");
            // 设置当前点的死亡状态
            dead = true;
        }
    }

    /**
     * 返回当前点的死亡状态
     * @return
     */
    public boolean isDead() {
        return dead;
    }

}

/Josephus/src/com/kodoyang/Josephus/Ring.java

定义犹太人轮流报数的环的类

package com.kodoyang.Josephus;

/**
 * 这是一个报数的环,它由数组实现
 * 在对象实例化的时候确定了点的个数,不在改变
 *
 * 它由一个个的点拼接而成
 * pos用来记录当前点的位置,num用来记录当前报出的数字
 *
 * @author yuki
 *
 */
public class Ring {

    // 它由一个个的点拼接而成
    private Vertex[] vers;
    // 记录当前点的位置
    private int pos;
    // 记录当前报出的数字
    private int num;

    /**
     * 构造方法
     * @param n 环拥有的节点数
     */
    public Ring(int n){
        // 创建构成环的点的数组
        vers = new Vertex[n];
        // 初始化点的数组
        for(int i = 0; i < vers.length; ++i){
            // 点的构造方法必须接受一个表示点的id的参数
            Vertex ver = new Vertex(i);
            // 把点初始化给数组的第i个位置
            vers[i] = ver;
        }
        // 构造完毕并不能让他马上进入报数状态,所以设报数值为-1
        num = -1;
    }

    /**
     * 报数
     * @return 返回true表示有点死亡,否则没有点死亡
     */
    public boolean call(){

        // 执行,如果当前的位置不在死亡状态就跳出循环
        do {
            // 获得下一个位置,如果下一个位置是末尾就设为0, 其它情况加1
            pos = pos == vers.length - 1 ? 0 : pos + 1;
        } while( vers[pos].isDead() );

        // 获得下一个要报的数,如果下一个位置是2就设为0, 其它情况加1
        num = num == 2 ? 0 : num + 1;
        // 让点报数
        vers[pos].act(num);
        // 当点报出的数为2时,说明报数的点死亡了
        return num == 2;
    }

}

运行结果如下:

id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival :
id = , num =
id = , num =
id = , num =
......I am dead......
---------------------------Survival : 

更多好文请关注:http://www.cnblogs.com/kodoyang/

约瑟夫环 --- 面向对象 --- java代码的更多相关文章

  1. 约瑟夫环(java面向对象实现)

    /* * 作者:zhaop * 功能:约瑟夫环 * */ public class Joseph { public static void main(String[] args) { // TODO ...

  2. 约瑟夫环的java解决

    总共3中解决方法,1.数学推导,2.使用ArrayList递归解决,3.使用首位相连的LinkedList解决 import java.util.ArrayList; /** * 约瑟夫环问题 * 需 ...

  3. 约瑟夫环问题-Java数组解决

    约瑟夫环问题说的是,n个人围成一圈,从第k个人开始沿着一个方向报数,报到第m个人时,第m个人出列,从紧挨着的下一个人(未出列)开始,求整个环中人的出列顺序.下面是我用java实现的解决方法. clas ...

  4. 约瑟夫环的java实现

    转自:http://www.cnblogs.com/timeng/p/3335162.html 约瑟夫环:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到 ...

  5. 面向对象---java代码块

    概念:代码块是指用{}括起来的一段代码. 根据位置及声明的关键字不同,代码块可分为普通代码块.构造块.静态代码块.同步代码块4种. 1.普通代码块: 直接在方法中或在语句中定义 public clas ...

  6. 约瑟夫环(java)

    问题描述:n个人围成一圈,每隔k个杀死一个,问最后的幸存者的编号 假设标号是0 ~ n-1,幸存者是f[n] 1.特殊情况:f[1]=0 2.一般情况:f[n] = (f[n-1]+k)%n 游戏开始 ...

  7. 约瑟夫环简介,问题以及java实现

    问题:一群猴子排成一圈,按1,2,--.,n依次编号.然后从第一只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,再把它踢出去-------.,如此不停的进行下去,直到最后只剩下一只猴 ...

  8. j使用数组实现约瑟夫环 java

    我们首先来看一下约瑟夫环问题: 给定m个人,m个人围成一圈,在给定一个数n,从m个人中的第一个人每第n个人便将其除去,求被最后一个出去的人的编号. 思路: 建立一个长度为m+1的数组,将其的内容初始化 ...

  9. 约瑟夫环 java实现

    问题: N个人从1到N编号.围城一圈,从1開始报数, 数到X时,将X的编号输出,并将那个人踢出, 下一个从1再開始报数,直到全部人都出去 思路: 就是计数.移除,没有太深的思想,直接上代码: pack ...

随机推荐

  1. c语言中argc和argv是什么意思?

    argc是参数个数,定义为intargv是字符串数组,存的是参数,定义为char**或者char* argv[]比如你编译好的程序为my.exe在命令行执行 my.exe 1 2 3那argc就是4, ...

  2. 界面上传文件js包【AjaxUpload.js】

    function uploadFile() { new AjaxUpload($("#importFile"), { action: url, type: "POST&q ...

  3. 【笔记】一些linux实用函数技巧【原创】

    函数返回的是函数的地址 kallsyms_lookup_name()

  4. [HIHO1039]字符消除(字符串,枚举,模拟)

    题目链接:http://hihocoder.com/problemset/problem/1039 思路:枚举所有字符更新的位置和ABC三种修改方案,之后再模拟消除规则,一步一步去消除.直到无法消除, ...

  5. 浅析JavaScript之Function类型

    JavaScript中的函数实际上是对象,每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上只是指向函数对象的指针,保存函数在堆内存中的地 ...

  6. [ionic开源项目教程] - 第15讲 ionic用户个人中心登录注册的实现

    第15讲 ionic用户个人中心登录注册的实现 这一讲包括登陆.注册.个人中心.个人资料页面的实现. 在一讲的改动有四个地方: 在config.js里配置接口地址 完善个人中心的服务层(service ...

  7. codeforces 431 B Shower Line【暴力】

    题意:给出五个人的编号,分别为 1 2 3 4 5,他们在排队, 最开始的时候,1和2可以交谈,3和4可以交谈 然后1走了之后,2和3交谈,4和5可以交谈 2走了之后,3和4可以交谈, 3走了之后,4 ...

  8. Sqlite数据库 找不到请求的 .Net Framework Data Provider。可能没有安装

      解决方法 在web.config里面添加 <system.data> <DbProviderFactories> <remove invariant="Sy ...

  9. UVALive 4043 Ants 蚂蚁(二分图最佳完美匹配,KM算法)

    题意: 有n个蚂蚁n棵树,蚂蚁与树要配对,在配对成功的一对之间连一条线段,要求所有线段不能相交.按顺序输出蚂蚁所匹配的树. 思路: 这个题目真是技巧啊,不能用贪心来为每个蚂蚁选择最近的树,这样很可能是 ...

  10. web前端调试工具

    1.firebug入门指南 http://www.ruanyifeng.com/blog/2008/06/firebug_tutorial.html 2. Console命令详解,让调试js代码变得更 ...