约瑟夫问题解决方案

来源:互联网 发布:linux日志查询命令 编辑:程序博客网 时间:2024/05/20 08:24
/** * 作者:永锋 * 功能:约瑟夫问题 */package demo4;public class Yuesefu {public static void main(String[] args) {// TODO Auto-generated method stubCyclink 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 palyChild 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 childfor(int j=1; j<this.m; j++){preChild = curChild;curChild = curChild.netxtChile;}//del the m childpreChild.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(" ");}}

0 0