黑马程序员——约瑟夫环问题

原创 2012年03月21日 16:14:29
---------------------- android培训java培训、期待与您交流! ----------------------/**
*李见黎
*2012-3-14
*约瑟夫环问题
*/


public class  Josephu
{
public static void main(String[] args) 
{
CycLink cl=new CycLink();
cl.setLen(5);
cl.CreateCyc();
cl.Show();
cl.setK(2);
cl.setM(2);
cl.Play();
}
}
/**
 * 循环列表类
 * @author 李见黎
 *
 */
 class CycLink
{
int Len;
Child firstChild=null; //初始化第一个元素对象,第一个指针不变
Child temp=null;     //定义一个游标,非常有用

int k=0;
public void setK(int k)
{
this.k=k;
}

int m=0;
public void setM(int m)
{
this.m=m;
}
public void setLen(int len)
{
this.Len=len;
}
/**
* 创建循环链表
*/
public void CreateCyc()
{
for(int i=1;i<=this.Len;i++)
{
if(i==1)
{//是第一个元素,将第一个对象的引用付给firstChild和temp
Child ch=new Child(i);
this.firstChild=ch;
this.temp=ch;

}
else
{
if(i==Len)
{//是最后一个元素
Child ch=new Child(i);
temp.nextChild=ch;
temp=ch;
temp.nextChild=this.firstChild;
}
else
{
Child ch=new Child(i);
temp.nextChild=ch; //游标指向下个
temp=ch; //游标移动
}
}
}
}
/**
* 执行约瑟夫算法
*/
public void Play()
{
Child temp=this.firstChild;
//1.找到开始元素K
for(int i=1;i<k;i++)
{//都是从1开始的
temp=temp.nextChild;
}
//2.数M个元素

while(Len!=1)
{
for(int j=1;j<m;j++)
{
temp=temp.nextChild;
}
//找到要出圈的前一个元素
Child temp2=temp;

while(temp2.nextChild!=temp)
{
temp2=temp2.nextChild;
}

//2.第M个元素出圈
temp2.nextChild=temp.nextChild;
temp=temp.nextChild;

this.Len--;
}
//最后一个元素
System.out.println("最后一个出圈的是:"+temp.num);

}
/**
* 显示函数
*/
public void Show()
{
Child temp=this.firstChild; //定义一个游标,可以使firstChild不改变,之改变游标就可以


do
{
System.out.println(temp.num);
temp=temp.nextChild; //移动tempt
}
while (temp!=this.firstChild);
}


}
/**
 * 元素类,属性有,序列号,指向下一个的引用
 * @author 李见黎
 */
 class Child
{
int num;
Child nextChild=null;  //非常重要,很难想到,创建指向下一个的指针


public Child(int num)
{
this.num=num;
}
}--------------------- android培训java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima

约瑟夫环问题的两种解决方式(递归求解和数组模拟求解)

约瑟夫环问题各位Acmer肯定都遇到过,就是给你编号为从0~n-1的n个人,从头开始报数,报到m的人离场,问最后留下的人是几号。有两种方法解决这个问题 第一种:数组模拟 这种方法没什么好说的,就是模拟...
  • Sara_YF
  • Sara_YF
  • 2016-06-19 13:03:26
  • 1202

Java实现约瑟夫环问题

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;...
  • qq_21150865
  • qq_21150865
  • 2017-03-05 14:48:34
  • 5598

约瑟夫环问题的几种解法

一、问题的来历     据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲在一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于...
  • ltxiaobing
  • ltxiaobing
  • 2015-12-27 14:55:46
  • 1990

最简化约瑟夫环问题的递归算法详细解析

这个问题可能每个学算法的同学都会遇见,我没那么聪明,第一次看见时做不出来,只发现一些规律,后面看到算法也挺久才看懂,这里是将别人的算法结果做一个解析,例子是暂时网上找的递归最简洁的例子: 下面就以这个...
  • m15682532244
  • m15682532244
  • 2017-10-21 15:54:28
  • 597

程序员面试宝典之数据结构基础----循环链表(约瑟夫环问题)

关于循环链表,即单链表的为指针指向头结点,当然在建立循环链表的时候可以将链表的为指针指向头结点,但本例用的是先建立一个只有一个节点的循环链表(即next指针指向自己结点),然后再在此循环链表中插入节点...
  • crazyer2010
  • crazyer2010
  • 2012-10-03 18:51:45
  • 4561

PHP篇之二个函数解决约瑟夫环问题

讲故事了! 约瑟夫环问题起源于一个犹太故事。:   罗马人攻占了桥塔帕特,41个人藏在一个山洞中躲过了这场浩劫。这41个人中,包括历史学家Josephus(约瑟夫)和他的一个朋友。剩余的39个人为...
  • backOrigin
  • backOrigin
  • 2016-12-17 23:14:20
  • 1191

约瑟夫环问题(运用递推)

利用数学推导,下面是推导的过程:         (1)第一个被删除的数为 (m - 1) % n。         (2)假设第二轮的开始数字为k,那么这n - 1个数构成的约瑟夫环为k...
  • haoni123321
  • haoni123321
  • 2012-01-05 16:31:33
  • 4918

约瑟夫环问题(数组和list方法)

先介绍一下什么是约瑟夫环问题:就是N个人围成一圈,从开头(下标为0)报数,报到你设置的Number就要出局,几轮下来后剩下最后一个人输出这个人的序号! 这里只介绍两种比较浅显易懂自己编写的代码,另外...
  • wujiafei_njgcxy
  • wujiafei_njgcxy
  • 2017-08-10 19:51:30
  • 388

约瑟夫环(数学高效率解法,很详细)

 5.5.4 用数学方法解约瑟夫环(1) 原文copy:http://book.51cto.com/art/201403/433941.htm 5.5.4  用数学方法解约瑟夫环(1...
  • qq_25973267
  • qq_25973267
  • 2015-12-25 22:49:21
  • 7369

循环队列解决约瑟夫环问题。

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出...
  • Leafage_M
  • Leafage_M
  • 2016-12-18 14:11:37
  • 1705
收藏助手
不良信息举报
您举报文章:黑马程序员——约瑟夫环问题
举报原因:
原因补充:

(最多只允许输入30个字)