java实现约瑟夫问题

博客内容仅作学习交流之用,详细内容参见网络资源,欢迎大家交流探讨!

 

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

josephproblem

——Ronald L.Graham,Donald E.Knuth,Oren Patashnik .《具体数学:计算机科学基础:第2版》,人民邮电出版社,2013 :7 .

//Author:BonJean
//功能:实现约瑟夫问题
//date:2014.07.21
//package package_02;
public class JosephQ {
 public static void main(String[] args){
  int N=41;//N children
  int k=1;//2nd start
  int m=3;//m out
  CycLink cyclink=newCycLink();
  cyclink.setLen(N);
  cyclink.setK(k);
  cyclink.setM(m);
  cyclink.createLink();
  cyclink.show();
  cyclink.play();
 }
}

//create class Child
class Child{
 int no;//every child's number
 Child nextChild=null;
 public Child(int no){
  this.no=no;//give anumber
 }
}

//create a cycle link
class CycLink{
 Child firstChild=null;
 Child temp=null;
 int len=0;//圈中有len个小孩
 int k=0;//从第k个开始数
 int m=0;//数到m的小孩出圈
 
 //set len
 public void setLen(int n){
  this.len=n;
 }
 
 //set k
 public void setK(int k){
  this.k=k;
 }
 
 //set m
 public void setM(int m){
  this.m=m;
 }
 
 //start up game
 public void play(){
  Childtemp=this.firstChild;
  Child temp2=temp;//another onefind
  //find out the start one
  for(int i=1;i
   temp=temp.nextChild;
  }
  System.out.print("The quiter'snumber:");
  while(len!=0){
   //find outthe one will go out
   for(intj=1;j
    //findout the one before the one will quit 1
    if(j==m-1){
     temp2=temp;
    }
    temp=temp.nextChild;
   }
   
   //the onequit
   temp2.nextChild=temp.nextChild;
   System.out.print(temp.no+"");
   temp=temp.nextChild;
   this.len--;
  }
 }
 
 public void createLink(){
  for(inti=1;i<=len;i++){
   if(i==1){
    Childch=new Child(i);
    this.firstChild=ch;
    this.temp=ch;
   }elseif(i==len){
    Childch=new Child(i);
    this.temp.nextChild=ch;
    this.temp=ch;
    this.temp.nextChild=this.firstChild;
   }else{
    Childch=new Child(i);
    this.temp.nextChild=ch;
    this.temp=ch;
   }
  }
 }
 
 public void show(){
  Childtemp=this.firstChild;
  System.out.print("There are"+this.len+" childern:");
  do{
   System.out.print(temp.no+"");
   temp=temp.nextChild;
  }while(temp!=this.firstChild);
  System.out.println();
 }
}



 
 

参考文献

[1]  Ronald L.Graham,Donald E.Knuth,Oren Patashnik 《具体数学:计算机科学基础:第2版》 :人民邮电出版社 ,2013 :7 


/**
 *站在巨人的肩上才能看得更远,一步一个脚印才能走的更远。分享成长,交流进步,转载请注明出处!
 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值