约瑟夫环是一个数学的应用问题:
写道
已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
如同杀人游戏啊,哈哈,假如有6个人,要杀掉5个人,从1开始报数,叫到2的杀掉,用程序怎么写呢,作为程序员的我,开始吭哧吭哧的写了,不会数学算法啊,只能用程序员的方式解决。
package com.ssm.common;
import java.util.ArrayList;
import java.util.List;
public class Josephus {
List<Peple> pepleList = new ArrayList<Peple>();
class Peple {
int next;//下一个人
int index;// 本人序号
boolean flag = true;//是否活着
}
/**
* 杀人
* @param total 总人数
* @param killNum 需要杀死的人数
* @param m 报到此数将被杀死
*/
public void jsph(int total,int killNum,int m) {
int startIndex = 0;//开始序号
int count = 1;//报数开始
int killedCount=0;//被杀的人总数
while (killedCount<killNum) {//被杀的人数等于设定的杀人数量 则结束
//1、判断当前这个人是否可以杀
if (count == m)
{
pepleList.get(startIndex).flag = false;//杀死
++killedCount;
count=0;
System.out.println(pepleList.get(startIndex).index+" is killed");
}
//2、找到下一个人,进行报数
do
{
startIndex=pepleList.get(startIndex).next;//被杀的下一个人
}
while(!pepleList.get(startIndex).flag);//循环直到找到活人
//2、向下报数
++count;
}
showResult();//显示结果
}
private void showResult()
{
System.out.print("\n\nresult:");
for (int i = 0; i < pepleList.size(); i++) {
if(pepleList.get(i).flag)
System.out.print(pepleList.get(i).index+"[live] ");
else
System.out.print(pepleList.get(i).index+"[dead] ");
}
}
/**
* 启动游戏
* @param total 总人数
* @param killNum 需要杀死的人数
* @param m 报到次数将被杀死
*/
public void startGame(int total,int killNum,int m) {
System.out.println("Rule:total is "+total+",killNum is "+killNum+",callNum is "+m);
System.out.println("\n\nInit peples...");
for (int i = 0; i < total; i++) {
Peple p = new Peple();
p.index = i;// 序号
p.next = (i == total-1) ? 0 : i+1;
pepleList.add(p);
System.out.print("["+p.index+"]");
}
System.out.println("\n\nGame is starting...");
this.jsph(total,killNum,m);//杀人
}
public static void main(String[] args) {
new Josephus().startGame(6, 5, 2);
}
}
运行结果:
Rule:total is 6,killNum is 5,callNum is 2
Init peples...
[0][1][2][3][4][5]
Game is starting...
1 is killed
3 is killed
5 is killed
2 is killed
0 is killed
result:0[dead] 1[dead] 2[dead] 3[dead] 4[live] 5[dead]
没学过算法设计啊,只能这么写,最后发现这个问题有个公式啊,请看http://baike.baidu.com/view/717633.htm#sub717633,最后想说的是,学好数学还是蛮有用的啊,后悔ing.
分享到:
相关推荐
循环队列和约瑟夫环问题 循环队列是一种特殊的队列结构,它的特点是队列的末尾元素连接着队列的开头元素,形成一个环形结构。这种数据结构可以用来解决约瑟夫环问题。 约瑟夫环问题是一个经典的问题,它是由古罗马...
【敢死队问题(约瑟夫环问题的应用)】是一个经典的计算机科学问题,它涉及到数据结构和算法的设计。在这个问题中,M个敢死队员通过循环计数的方式决定执行任务的顺序,每数到5的人将执行任务并退出,直至只剩下一个...
使用c语言中的循环链表及结构体实现约瑟夫环问题
数据结构中的约瑟夫环问题是一种经典的编程问题,它涉及到链表这一数据结构的应用。在本文中,我们将深入探讨约瑟夫环问题的背景、原理以及如何使用链表来求解这一问题,同时分析给定代码的具体实现细节。 ### ...
约瑟夫环问题,也称为约瑟夫环序列或约瑟夫问题,是一个著名的理论问题,源自古罗马历史上的一个故事。在这个问题中,人们围成一个圈,并按照一定的规则依次淘汰,最后留下来的人被称为“幸存者”。具体规则是:从...
约瑟夫环问题,也称为约瑟夫问题,是一个经典的理论问题,源于古罗马时期的传说。问题描述了一群人围坐成一个圆圈,按照一定的规则进行报数,每数到特定数字的人会被排除,直到所有人都被排除。在这个场景中,我们...
多种方法解决约瑟夫环问题,1.顺序表2.循环链表3.循环队列4.普通一位数组
约瑟夫环问题,也被称为约瑟夫环序列或约瑟夫问题,是一个著名的理论问题,源自古罗马历史上的一个故事。在这个问题中,人们站成一个圈,并按顺时针方向编号。从某个人开始,每隔特定的人数,这个人就会被排除出圈,...
约瑟夫环问题解析 约瑟夫环问题是计算机科学和数学中一个著名的问题,它是指在一个圆圈中的人按照一定的规则依次出列的问题。该问题的解析报告将从以下几个方面进行讲解: 一、问题描述 约瑟夫环问题可以用以下...
约瑟夫环问题,也称为约瑟夫环序列或约瑟夫问题,是一个著名的理论问题,源自古罗马历史的一个故事。在数学和计算机科学中,它通常被用来演示各种算法,特别是循环移位和递归算法。这个问题描述如下:假设有一群人围...
《C语言实现约瑟夫环问题详解》 约瑟夫环问题,又称约瑟夫环序列,是一个著名的理论问题,源自古罗马的一个传说。在这个问题中,人们围成一个圈,按照一定的规则逐个淘汰,直到剩下最后一个人为止。这个问题在...
约瑟夫环问题实验报告 约瑟夫环问题,这个名字起源于公元一世纪的犹太历史学家约瑟夫·弗拉维乌斯,在计算机科学领域,它已经演变成为了一个极具挑战性的数据结构问题。该问题描述了一个假想的场景:一群人围成一圈...
用循环队列解决约瑟夫环问题减少用顺序表在出对是循环移动带来的空间复杂度
在本项目中,我们将探讨如何使用Python编程语言来实现两种有趣的数学和计算机科学相关的游戏:模拟轮盘抽奖游戏和模拟报数游戏,也称为约瑟夫环问题。这两个游戏不仅有趣,而且能帮助我们理解循环、列表操作以及算法...
数据结构中的约瑟夫环问题 C语言编写,已经测试通过
约瑟夫环问题的源代码分析 约瑟夫环问题是计算机科学中的一种经典问题,描述的是10个小孩围坐在一圈,并给他们依次编号,指定从第s个小孩开始报数(从1~n报数),报到n的小孩出列,然后依次重复下去,直到所有的...
标题中的“C语言编写的关于约瑟夫环问题的程序”指的是使用C编程语言实现的一个经典算法问题——约瑟夫环(Josephus Problem)。约瑟夫环问题是一个理论上的问题,通常在计算机科学和数学中被用作示例,以讨论和解决...