您的位置:首页 > 编程语言 > Java开发

丢手帕问题 (约瑟夫问题)Java实现

2010-10-31 01:40 609 查看
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。


public class Demo4 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
CycLink cyclink  =new CycLink();
cyclink.setLen(100);
cyclink.creatLink();
cyclink.setK(2);
cyclink.setM(2);
cyclink.show();
cyclink.play();
}
}
class Child{
int no;
Child nextChileChild=null;
public Child(int no){

this.no=no;
}

}
//环形链表
class CycLink{

//先定义一个指向链表第一个小孩的那个引用
//指向第一个小孩的引用,不能动
Child firstChild=null;
Child temp=null;
int len=0;//表示共有几个小孩
int k;
int m;
//设置链表大小
public void setLen(int len){
this.len=len;
}
public void setK(int k){
//设置第几个人开始数数
this.k=k;
}
public void setM(int m){
//设置m
this.m=m;
}
public void play(){
//1找到开始数数的人

Child temp=this.firstChild;
for(int i=1;i<k;i++){
temp=temp.nextChileChild;

}
//数M下
while(this.len!=1){
for (int j = 1; j < m; j++) {

temp=temp.nextChileChild;
}

Child temp2=temp;//找到要出圈的前一个小孩
while (temp2.nextChileChild!=temp) {
temp2=temp2.nextChileChild;

}
//讲数到M的小孩 退出圈
temp2.nextChileChild=temp.nextChileChild;
temp=temp.nextChileChild;
System.out.println("现在出圈的是"+temp.no);
this.len--;
}
//打印最优一个小孩
System.out.print("最后出圈的是:"+temp.no);
}
//初始化链表
public void creatLink(){
for (int i = 1; i <= len; i++) {

if (i==1) {
//创建第一小孩
Child child=new Child(i);
this.firstChild=child;
this.temp=child;
}else
{
if (i==len) {
Child child =new Child(i);
temp.nextChileChild=child;
temp=child;
temp.nextChileChild=this.firstChild;

}else {

//继续创建小孩
Child child =new Child(i);
temp.nextChileChild=child;
temp=child;}
}

}

}
public void show(){

Child temChild=this.firstChild;
do {
System.out.println(temChild.no+"###");
temChild=temChild.nextChileChild;
} while (temChild!=this.firstChild);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: