使用顺序表求解约瑟夫环问题 (自定义顺序表)
来源:互联网 发布:无人驾驶云计算 编辑:程序博客网 时间:2024/06/06 03:45
约瑟夫环(Josephus)问题:古代某法官要判决n个犯人的死刑,他有一条荒唐的法律,将犯人站成一个圆圈,从第s个人开始数起,每数到第d个犯人,就拉出来处决,然后再数d个,数到的人再处决……直到剩下的最后一个可赦免。当n=5,s=1,d=2,时:
第一步:定义一个顺序表SeqList<T>:
public class SeqList<T> implements LList<T>{private Object[] element;private int len;public SeqList(int size){this.element=new Object[size];this.len=0;}public SeqList(){this(64);}public SeqList(SeqList<T> list){//拷贝构造方法(深度拷贝)this.len=list.len;this.element=new Object[list.element.length];for(int i=0;i<list.element.length;i++){this.element[i]=list.element[i];}}public boolean isEmpty(){return this.len==0;}public int length(){return this.len;}public T get(int i){if(i>=0&&i<this.len)return (T)this.element[i];return null;}public void set(int i,T x){if(x==null)return;if(i>=0&&i<this.len)this.element[i]=x;elsethrow new IndexOutOfBoundsException(i+"");}public void insert(int i,T x){if(x==null)return;if(this.len==this.element.length){Object[] temp=this.element;this.element=new Object[this.element.length*2];for(int j=0;j<temp.length;j++){this.element[j]=temp[j];}}if(i<0){i=0;}if(i>this.len){i=this.len;}for(int j=this.len-1;j>=i;j--){this.element[j+1]=this.element[j];}this.element[i]=x;this.len++;}public void append(T x){insert(this.len,x);}public T remove(int i){if(this.len==0||i<0||i>=this.len)return null;T old=(T)this.element[i];for(int j=i;j<this.len-1;j++){this.element[j]=this.element[j+1];}this.element[this.len-1]=null;this.len--;return old;}public void removeAll(){this.len=0;}public T search(T key){int index=this.indexOf(key);return index==-1?null:(T)this.element[index];}public int indexOf(T key){if(key!=null){for(int i=0;i<this.len;i++){if(this.element[i].equals(key)){return i;}}}return -1;}public boolean contain(T key){return this.indexOf(key)>=0;}public boolean equals(Object o){if(this==o)return true;if(o instanceof SeqList){SeqList<T> list=(SeqList<T>)o;if(list.length()==this.length()){for(int i=0;i<list.length();i++){if(!this.get(i).equals(list.get(i)))return false;}return true;}}return false;}public String toString(){String str="(";if(this.len>0){for(int i=0;i<this.len;i++){if(i<this.len-1) str+=this.element[i].toString()+",";else str+=this.element[i].toString();}}return str+")";}}
第二步:定义一个约瑟夫环并求解:
public class Josephus {public Josephus(int number,int start,int distance){SeqList<String> list=new SeqList<String>(number);for(int i=0;i<number;i++){list.append((char)('A'+i)+"");}System.out.print("约瑟夫环("+number+","+start+","+distance+"),");System.out.println(list.toString());int i=start;while(list.length()>1){i=(i+distance-1)%list.length();System.out.print("删除的元素:"+list.remove(i).toString()+",");System.out.println(list.toString());}System.out.println("被赦免的罪犯是:"+list.get(0).toString());}public static void main(String[] args) {new Josephus(5,0,2); }}
第三步运行结果:
约瑟夫环(5,0,2),(A,B,C,D,E)
删除的元素:B,(A,C,D,E)
删除的元素:D,(A,C,E)
删除的元素:A,(C,E)
删除的元素:E,(C)
被赦免的罪犯是:C
- 使用顺序表求解约瑟夫环问题 (自定义顺序表)
- 使用顺序表求解约瑟夫环问题
- 使用顺序表类SeqList求解约瑟夫环问题
- 使用顺序表求解约瑟夫环问题 (利用java中的ArrayList)
- 约瑟夫问题(顺序表)
- 顺序表(约瑟夫环)
- 用顺序表实现约瑟夫环问题
- 0010用顺序表实现约瑟夫环(Josephus)问题
- 顺序表实现Josephus(约瑟夫斯)环问题
- 使用单链表求解约瑟夫环问题 (自定义单链表)
- 顺序表之约瑟夫环(josephus)
- 顺序表求约瑟夫环。
- 约瑟夫环-顺序表-C++
- 【学习总结】顺序表模拟约瑟夫问题
- 数据结构之顺序表应用-----《约瑟夫问题》
- 约瑟夫环问题(顺序表)——C++实现
- Josephus环问题——顺序表求解
- 两种方法实现约瑟夫环(链表,顺序表)
- Thread & TreeView in maxScript Reference
- Linux下的段错误产生的原因及调试方法
- 分枝界限法
- 如何免费获取百度文档,简单实用,2013亲测
- select模型中需不需要ioctlsocket的问题
- 使用顺序表求解约瑟夫环问题 (自定义顺序表)
- NSLog输出
- use icc and ifort in openmpi
- const疑惑
- hdu 2112 HDU Today
- poj 3974 HDU 3068
- 用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至最后一个元素并输出该元素的值
- 继续我的代码,分享我的快乐 - WEBUS2.0 资源汇总
- Android电池驱动