/**
@author sunqian
@time 2015.1.27
@功能 约瑟夫(丢手帕)问题
@描述 n个小孩围坐,从k位小孩开始开始约定一个数m并开始轮流报数,数到m的小孩出列直到列表为空,并打印出列顺序 */ package com.sunqian.yuesefu;
public class Yuesefu {
/**
@param args */ public static void main(String[] args) { // TODO Auto-generated method stub CyLink c1=new CyLink(15,2,2); c1.play(); }
}
//环形链表 class CyLink{ //属性
Child firstChild=null; Child temp=null; int len=0; int k; int m; //设置链表大小len,开始位置k,报数m public CyLink(int len,int k,int m){ this.len=len; this.k=k; this.m=m; } //开始游戏 public void play(){ //小孩围坐,创建链表并打印 this.createLink(); this.show(); System.out.println("从"+k+"位小孩开始开始约定一个数"+m+"并开始轮流报数,数到"+m+"的小孩出列"); //1,到第k个小孩 Child childk=this.find(this.firstChild, this.k); //2.开始玩耍 int left=this.len; Child bnc=childk; while(left>0){
Child childM=this.find(bnc, m);
Child childBM=this.find(bnc, m-1);
bnc=childM.nextChild;
System.out.println("出列孩子"+childM.no);
childBM.nextChild=childM.nextChild;
if(left==1)System.out.println("出列完毕!");
left--;
}
} //给定开始小孩,找到第K个小孩,包括开始小孩 public Child find(Child begin,int k){ Child kchild=begin; for(int i=1;i
}
} }
//打印链表 public void show(){ Child temp=this.firstChild; System.out.println("总共有"+this.len+"个小孩"); do{ System.out.println("第"+temp.no+"个小孩序号为"+temp.no); temp=temp.nextChild; }while(temp!=this.firstChild); } } //小孩类 class Child{ int no; Child nextChild=null;
//构造方法 Child(){
} public Child(int no){ this.no=no;
} }