/**
* 作者:永锋
* 功能:约瑟夫问题
*/
package demo4;
public class Yuesefu {
public static void main(String[] args) {
// TODO Auto-generated method stub
Cyclink c = new Cyclink();
c.setLen(36);
c.CreatLink();
c.ShowLink();
c.setK(5);
c.setM(3);
c.play();
}
}
class Child
{
int num;
Child netxtChile = null;
public Child(int num)
{
this.num = num;
}
}
//环形链表
class Cyclink
{
//指向第一个小孩的引用,不能动
Child firstChild = null;
Child temp = null;
int len = 0; //表示共有多少个小孩
int k = 0; //表示从第几个开始数
int m = 0; //表示从第K个开始数,数到第M个
public void setLen(int len)
{
this.len = len;
}
public void setK(int k)
{
this.k = k;
}
public void setM(int m)
{
this.m = m;
}
//初始化环形链表
public void CreatLink()
{ for(int i = 1; i<=len; i++)
{
Child ch = new Child(i);
if(i == 1){
//创建第一个小孩
this.firstChild = ch;
this.temp = this.firstChild;
}else if(i == len){
this.temp.netxtChile = ch;
this.temp = ch;
this.temp.netxtChile = this.firstChild;
}else{
this.temp.netxtChile = ch;
this.temp = ch;
}
}
}
public void play()
{
//find the k child to start paly
Child curChild = this.firstChild;
Child preChild = this.firstChild;
Child tmp = null;
//find the preChild
do{
preChild = preChild.netxtChile;
}while(preChild.netxtChile != curChild);
do{
for(int i=1; i<this.k; i++)
{
preChild = curChild;
curChild = curChild.netxtChile;
}
//find the m child from the k child
for(int j=1; j<this.m; j++)
{
preChild = curChild;
curChild = curChild.netxtChile;
}
//del the m child
preChild.netxtChile = curChild.netxtChile;
curChild = curChild.netxtChile;
this.len--;
tmp = curChild;
do{
System.out.print(tmp.num + " ");
tmp = tmp.netxtChile;
}while(tmp != curChild);
System.out.println("最后出圈:" + curChild.num);
}while(this.len != 1);
System.out.println("最后出圈:" + curChild.num);
}
public void ShowLink()
{
Child temp = this.firstChild;
do{
System.out.print(temp.num + " ");
temp = temp.netxtChile;
}while(temp != this.firstChild);
System.out.println(" ");
}
}
约瑟夫问题解决方案
最新推荐文章于 2022-06-27 18:43:41 发布