博客内容仅作学习交流之用,详细内容参见网络资源,欢迎大家交流探讨!
原始问题描述:据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了和,一开始要站在什么地方才能避免被处决?Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
——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
/**
*站在巨人的肩上才能看得更远,一步一个脚印才能走的更远。分享成长,交流进步,转载请注明出处!
*/