线性表应用_约瑟夫环问题
2017-11-01 22:16
316 查看
Josephus问题:
Josephus环问题:古代某法官要判决number个犯人的死刑,他有一条荒唐的法律,将犯人围成一个圈,从第start个人开始数,每数到第distance个犯人
就拉出来处决,然后从下一个人开始数,在数distance个,数到的人在处决
直到剩下最后一个人,赦免释放
线性表类代码:
public class SeqList<T> extends Object { //变量 protected Object[] element;//对象数组存储顺序表的数据元素,保护成员 protected int n;//element数组的实际元素个数 //第一种构造方法 public SeqList(int length) { //创建长度为length的线性表 this.element = new Object[length];//申请数组的存储空间,元素为null this.n = 0;//元素长度为0 } //返回线性表第i个元素 public T get(int i) { //若i在数组索引范围内,则返回数组element[i],否则返回null if(i>=0 && i< this.n) return (T)element[i]; //执行过return语句后跳出当前方法,不存在顺序执行 return null; } //返回顺序表中所有元素的描述字符串,覆盖Object类的toString方法 public String toString() { //返回格式:类名+(数据元素的字符串描述) String str; str = this.getClass().getName()+"("; if(this.n>0) str += element[0].toString(); for(int i=1; i<this.n; i++) str += ","+element[i].toString(); return str +")"; } //将数据 x 插入到数组element的第 i个位置,并返回插入的位置i public int insert(int i,T x) { if(x == null) throw new NullPointerException("x == null"); //默认置于顺序表第一个位置 if(i<0) i = 0; //不报异常,朝如到数组最后位置 if(i>this.n) i = this.n; Object[]source = this.element; //用途,中间变量,用于存放原来数组 //将原来数组扩充后,重新赋值 if(this.n == element.length) { //将原来数组容量扩充一倍 this.element = new Object[source.length*2]; //将位置 i 以前的数组先存入新的数组 for(int j=0; j<i; j++) this.element[j] = source[j]; } //将i之后的数组存入新的数组 for(int j = this.n-1; j>=i; j--) this.element[j+1] = source[j]; //将 x 嵌入数组中 this.element[i] = x; this.n++;//线性表长度增加 return i; } //删除第i个位置的元素,并返回被删除的元素 public T remove(int i) { //分为两部分,若i在数组索引范围内,删除元素,并返回,否则返回空 if(i>=0 && i<this.n) { //操作部分,将i+1至末尾元素向前移动覆盖原有元素,最后将最后一个元素值为null T old = (T)this.element[i];//将第i个元素进行T类型转换 for(int j=i; j<this.n-1; j++) { this.element[j] = this.element[j+1]; } this.element[this.n-1] = null; this.n--;//删除后,元素个数减一 return old; } return null; } }
主类代码:
public class Josephus{
protected int number;
protected int start,distance;
public Josephus(int number,int start,int distance)
{
this.number = number;
this.start = start;
this.distance = distance;
}
public void deal()
{
SeqList<String> list = new SeqList<String>(number);
for(int i=0; i<number; i++)
{
//坑,在插入元素时,不能调用set方法,因为对象数组只是创建了
//还未初始化,此时访问,任何一个成员都是数组越界
list.insert(i,(char)('A'+i)+"");
}
//将字符A至字符E插入到线性表中
System.out.println("Josephus问题:\n"+list.toString());
//犯人的初识位置是start
int i = start;
//处决犯人
//remove犯人
while(list.size()>1)
{
i = (i+distance-1)%list.size();
System.out.println("处决:"+list.remove(i)+",待处决"+list.toString());
}
System.out.println("赦免:"+list.toString());
}
public static void main(String args[])
{
Josephus josephus = new Josephus(5,0,2);
josephus.deal();
}
}
运行结果:
Josephus问题:
SeqList(A,B,C,D,E)
处决:B,待处决:SeqList(A,C,D,E)
处决:D,待处决:SeqList(A,C,E)
处决:A,待处决:SeqList(C,E)
处决:E,待处决:SeqList(C)
赦免:SeqList(C)
相关文章推荐
- 数据结构之线性表——约瑟夫环问题(循环链表的应用)
- 线性表的应用——求解两个多项式相加问题描述(顺序表求解)
- 线性表的应用——约瑟夫环
- 约瑟夫环问题 【循环链表的应用】
- (顺序表应用5.1.2)UVA 113 The Dole Queue(双向约瑟夫环问题:给出总人数n,顺时针数k个,逆时针数m个)
- 约瑟夫环的问题与应用(JAVA)
- Java实现约瑟夫环应用问题(精品)
- 链表的应用:利用无头结点循环链表解决约瑟夫环问题
- 【数据结构算法】约瑟夫环问题(线性表)
- (顺序表应用5.1.1)POJ 3750 小孩报数问题(基本的约瑟夫环问题:给出人数n,出发位置w,间隔数s)
- (顺序表的应用5.4.3)POJ 1012(约瑟夫环问题——保证前k个出队元素为后k个元素)
- (顺序表的应用5.4.3)POJ 1012(约瑟夫环问题——保证前k个出队元素为后k个元素)
- (线性数据结构5.4.1)UVA 130 Roman Roulette(标准约瑟夫环问题+替换者)
- (顺序表的应用5.4.2)POJ 1591 M*A*S*H(约瑟夫环问题的变形——变换步长值)
- 线性表及其应用——约瑟夫环问题
- [线性DP]轮渡问题(LIS应用)
- (顺序表应用5.1.1)POJ 3750 小孩报数问题(基本的约瑟夫环问题:给出人数n,出发位置w,间隔数s)
- (顺序表的应用5.4.2)POJ 1591 M*A*S*H(约瑟夫环问题的变形——变换步长值)
- 线性表_循环链表(增减删查 + 约瑟夫环问题 代码实现 )
- 数据结构(4)--循环链表的应用之约瑟夫环问题以及线性表总结之顺序表与链表的比较