约瑟夫环 --- 面向对象 --- java代码
约瑟夫环 的 面向对象 解法
罗马人占领乔塔帕特后,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代码的更多相关文章
- 约瑟夫环(java面向对象实现)
/* * 作者:zhaop * 功能:约瑟夫环 * */ public class Joseph { public static void main(String[] args) { // TODO ...
- 约瑟夫环的java解决
总共3中解决方法,1.数学推导,2.使用ArrayList递归解决,3.使用首位相连的LinkedList解决 import java.util.ArrayList; /** * 约瑟夫环问题 * 需 ...
- 约瑟夫环问题-Java数组解决
约瑟夫环问题说的是,n个人围成一圈,从第k个人开始沿着一个方向报数,报到第m个人时,第m个人出列,从紧挨着的下一个人(未出列)开始,求整个环中人的出列顺序.下面是我用java实现的解决方法. clas ...
- 约瑟夫环的java实现
转自:http://www.cnblogs.com/timeng/p/3335162.html 约瑟夫环:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到 ...
- 面向对象---java代码块
概念:代码块是指用{}括起来的一段代码. 根据位置及声明的关键字不同,代码块可分为普通代码块.构造块.静态代码块.同步代码块4种. 1.普通代码块: 直接在方法中或在语句中定义 public clas ...
- 约瑟夫环(java)
问题描述:n个人围成一圈,每隔k个杀死一个,问最后的幸存者的编号 假设标号是0 ~ n-1,幸存者是f[n] 1.特殊情况:f[1]=0 2.一般情况:f[n] = (f[n-1]+k)%n 游戏开始 ...
- 约瑟夫环简介,问题以及java实现
问题:一群猴子排成一圈,按1,2,--.,n依次编号.然后从第一只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,再把它踢出去-------.,如此不停的进行下去,直到最后只剩下一只猴 ...
- j使用数组实现约瑟夫环 java
我们首先来看一下约瑟夫环问题: 给定m个人,m个人围成一圈,在给定一个数n,从m个人中的第一个人每第n个人便将其除去,求被最后一个出去的人的编号. 思路: 建立一个长度为m+1的数组,将其的内容初始化 ...
- 约瑟夫环 java实现
问题: N个人从1到N编号.围城一圈,从1開始报数, 数到X时,将X的编号输出,并将那个人踢出, 下一个从1再開始报数,直到全部人都出去 思路: 就是计数.移除,没有太深的思想,直接上代码: pack ...
随机推荐
- Top 10 steps to optimize data access in SQL Server
2009年04月28日 Top 10 steps to optimize data access in SQL Server: Part I (use indexing) 2009年06月01日 To ...
- php安装了扩展提示undefined
安装curl扩展后仍然提示如下错误: Call to undefined function curl_init() 使用一下语句 输出NO echo function_exists('curl_ini ...
- Evaluate Reverse Polish Notation(堆栈)
Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...
- XManager介绍、安装、使用
简介 Xmanager是一款小巧.便捷的浏览远端X窗口系统的工具.在工作中经常使用Xmanager来登录远端的Linux系统,在X窗口系统上作图形化的操作.Xmanager可以将PC变成X Windo ...
- HDU 1506 Largest Rectangle in a Histogram
这个问题姑且也叫做最大子矩阵吧 给一个树状图,求一个最大面积的子矩阵 思路是这样的,对于每个单位矩阵,求出左边连续不比它低的矩阵的下标,放在l数组里 同样,再求出右边连续的不比它低的矩阵的下标 这样, ...
- poj 3353 Road Construction tarjan 边双联通分支 缩点+结论
题意:一个连通的无向图,求至少需要添加几条边,救能保证删除任意一条边,图仍然是连通的. 链接:http://poj.org/problem?id=3352 思路:边的双连通图.其实就是要求至少添加几条 ...
- 13.Object-C--浅谈Foundation框架常用的结构体
------- android培训.iOS培训.期待与您交流! ---------- 昨天学习了Foundation框架中常用的结构体,下面我简单的总结一下,如果错误麻烦请留言指正,谢谢! Found ...
- BZOJ 1078 斜堆
感谢MATO大神的博客 http://www.cppblog.com/MatoNo1/archive/2013/03/03/192131.html 注意细节. #include<iostream ...
- HDU 1548 A strange lift 奇怪的电梯(BFS,水)
题意: 有一座电梯,其中楼层从1-n,每层都有一个数字k,当处于某一层时,只能往上走k层,或者下走k层.楼主在a层,问是否能到达第b层? 思路: 在起点时只能往上走和往下走两个选择,之后的每层都是这样 ...
- acdream 1681 跳远女王(BFS,暴力)
Problem Description 娜娜觉得钢琴很无趣了,就抛弃了钢琴,继续往前走,前面是一片湖,娜娜想到湖的对岸,可惜娜娜找了好久都没找到小桥和小船,娜娜也发现自己不是神仙,不能像八仙过海一样. ...