大概花了一个晚上搭一个中午的时间,完善了一个关于Josephus的程序,这个Josephus游戏可是非常经典的算法,作为一个想从事软件的人最好能够理解一下,毕竟这个计算机教材上也讲过类似题目,具体的关于问题的描述我就不多说了,这个Josephus一般都是用队列来实现,当然了对于一个具体的算法而言数据结构并不是第一重要的,最重要的还是算法本身。这个程序关键之处还是在于如何巧妙地实现对淘汰的人的处理,用队列比较好实现。

public class CountDown {
   
public static Object josephus(Queue_List q,int k)throws QueueStackEmpty,QueueStackFull{

if(q.isEmpty()) return null;
while(q.size()>1){ 
q.traversal();//遍历所有队列元素 
for(int i=1;i<k;i++){
q.enqueue(q.dequeue()); 
}   
Object e=q.dequeue();
System.out.println("\n孩子"+e+"退出");
System.out.print("\n队头指针指向"+q.getItem(q.f)+"队尾指针指向"+q.getItem(q.r-1)+"\n");
}
return q.dequeue();
}
//将一组对象组织为一个队列
public static Queue_List buildQueue(Object[] a){
Queue_List ql = new Queue_List();    
for(int i=0;i<a.length;i++){
ql.enqueue(a[i]);
}
return ql;
}
public static void main(String[] args) {
 try{ 
String[] kid ={
"Alice","Bob","Cindy","Oliver","July",
"Rikc","Robin","Bill","Tom","Sam","Kim",
"Lin","Linda","UU","Baidu","Web"
};
System.out.println("最终的幸运者是:"+josephus(buildQueue(kid),1));
}catch(QueueStackEmpty e){
System.out.println("栈空了");
}catch(QueueStackFull e){
System.out.println("栈满了");
}
}

}
//模仿队列数据结构的类
class  Queue_List   {
   //队列的元素仍不能超过SIZE个元素,超过部分就会回到下标为0处,是否覆盖原来的数据取决于队头指针的值
    public final int SIZE = 17;
public Object[] Q;
    int f,r; //分别指向队头元素和队尾元素
public Queue_List(){
Q = new Object[SIZE];
f = -1; //队头指针初始化为-1;
}
public Queue_List(int num){
   Q= new Object[num];
   f = -1; //队头指针初始化为-1;
}
//返回指定元素的下标值
public int getElement(Object obj){
for(int i=0;i<r;i++){
if(Q[i].equals(obj))return i;
}
return -2;
}
//返回指定下标处的值
public Object  getItem(int index){
return Q[index];
}
//替换或设置指定下标处的值
public void setItem(int index,Object obj){
Q[index]=obj;
}
//弹出队头元素
public Object dequeue(){
       if(isEmpty())
       throw  new QueueStackEmpty("栈为空");
int i=f; 
f++; //队头指针往后移动一位
       return Q[i];
    }
//添加元素到队列中,添加成功返回true
public boolean enqueue(Object obj)throws QueueStackFull{
if(f == -1){  f=0;r=0; }
if(r>=(SIZE)){ //如果队尾指针已经到达尾部 
if(f==0){
throw new QueueStackFull("栈满了"); 

int tempF=f,tempSize=size();
for(int i=0,j=tempF;i<tempSize;i++,j++){
Q[i]=Q[j];
}
//重新定位队头指针和队尾指针
f=0;r=tempSize; 
}    
    Q[r]=obj;
    r++;    //队尾指针总是指向最后一个将要添加的元素  
    return true; 
    }
 
public int size() {   
return  (r-f);
}
 
public boolean isEmpty() {
   if(size()==0 || f== -1)
   return true;
return false;
}
public void traversal(){ 
int j=0;   
for(int i=f;i<r;i++){
  j++;
  if(j%10==0)
  System.out.println();
  System.out.print("  "+ Q[i]);
  }  
}
}

一个非常有趣的算法程序(有趣只针对程序猿)就是Josephus问题的更多相关文章

  1. 转一个csdn看到的帖子:而立之年的程序猿失业了 [问题点数:0分,结帖人jinxingfeng_cn]

    http://bbs.csdn.net/topics/390612263?page=1#post-395768948

  2. 一个net程序猿必备工具

    自古以来,人类的进步都是依赖于工具的进步,从刀耕火种,到使用青铜器,再到现在的科技,每一次都使我们的工作效率提高了无数倍,所以一个好的工具能使我们提高无数倍的工作效率,下面,我就根据自己简单的总结一下 ...

  3. 新建一个DataTable(只针对一列)

    /// <summary> /// 新建一个DataTable(只针对一列) /// </summary> /// <param name="dataStr&q ...

  4. 关于只针对ie7浏览器的css问题

    如代码: .centerDiv .search_k2{ margin-left: 18px; *margin-left: 9px; margin-top: 10px; height: 40px;} 中 ...

  5. WaitForSingleObject与WaitForMultipleObjects用法详解(好用,而且进入一个非常高效沉睡状态,只占用极少的CPU时间片)

    在多线程下面,有时候会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultipleObjects ...

  6. 面试王牌 JAVA 多态只针对方法 不针对属性

    子类是永远继承父类的非私有化方法,当子类中重写父类方法时,调用的是子类的方法,没有重写时,调用的是父类中的方法 1 多态是只针对方法,而不是属性的,但是写法上,子类重写父类的属性,编译器是不会报错的 ...

  7. 想让一个Widget成为模态,我们只需要对其设置setAttribute(Qt::WA_ShowModal, true);

    想让一个Widget成为模态,我们只需要对其设置: setAttribute(Qt::WA_ShowModal, true); 注意:这是QWidget的成员函数 ,也就是说,QWidget可以显示为 ...

  8. 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截

    程序猿修仙之路--数据结构之你是否真的懂数组?   数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构  .要想在之后的江湖历练中通关,数据结构必不可少. ...

  9. 每一个程序猿必知之SEO

    似乎由于受这篇文章的影响 http://katemats.com/what-every-programmer-should-know-about-seo/ 于是我也觉得我应该写一个每一个程序猿必知之S ...

随机推荐

  1. css.day01.eg

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. js如何设置网页横屏和竖屏切换

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  3. Notification封装(没做从网络下载)

    1.Notification作为消息通知,这里简单封装了使用 建立一个bean package com.jcut.view; /** * Author:JsonLu * DateTime:2016/2 ...

  4. 初定为EGame

    [Q]在纠结到底要用什么方式写博客,是原生态记录框架编写过程(有点所谓的手把手教学的感觉有木有),还是每个模块整合完毕后写分析文章,新手没有写过博客,不知道那种效果好.朋友们给点建议? 这套框架的初衷 ...

  5. How JSP work.

    A JSP page exists in three forms: JSP source code: consists of a mix of HTML template code. Java lan ...

  6. ArcGis(01)——地图切片以及发布底图服务

    ArcGis(01)——地图切片以及发布底图服务 环境 操作系统:win10_x64 Gis版本:Arcis server 10.2 准备 1.tif格式地图资源 2.Arcis server 10. ...

  7. Qt中如何在QCursor移动的时候不触发moveEvent

    有时候有这样的需求,比如想对全局光标进行一次setPos(),但这个时候又不想触发消息队列触发mouseMoveEvent,这个时候就可以这么做. myWidget->clearFocus(); ...

  8. 【FLYabroad 】微软内部代码检查工具 (Microsoft Source Analysis for C#)[转]

    SourceAnalysis (StyleCop)的终极目标是让所有人都能写出优雅和一致的代码,因此这些代码具有很高的可读性. 早就听说了微软内部的静态代码检查和代码强制格式美化工具 StyleCop ...

  9. select options常用操作

    1.判断select选项中 是否存在Value="value"的option元素 function jsSelectIsExitItem(objSelect,objItemValu ...

  10. uva 10820 (筛法构造欧拉函数)

    send a table When participating in programming contests, you sometimes face the following problem: Y ...