码迷,mamicode.com
首页 > 编程语言 > 详细

约瑟夫问题java实现

时间:2016-01-02 22:17:30      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:

 

据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个 人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个 人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了和,一开始要站在什么地方才能避免被处 决?Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。(如图,16和31号位置的自杀顺序 是40和41)

 

 
 
技术分享
 
 
技术分享
package easy;

import java.util.ArrayList;
public class Joseph{
    public static void main(String[] args)
    {
        Circle circle = new Circle(41);
        circle.getIndex(3, 41);
    }
}


class Person{
    int id;
    boolean isRemove;
    public Person(int id,boolean isRemove)
    {
        this.id=id;
        this.isRemove=isRemove;
    }
    public boolean isRemove(){
        return isRemove;
    }
    public void setRemove(boolean isRemove){
        this.isRemove=isRemove;
        
    }
}
class Circle{
    private ArrayList<Person> circle=new ArrayList<Person>();
    private int amount;
    Circle(int amount)
    {
        this.amount=amount;
        for (int i=0;i<amount;i++)
        {
            Person p=new Person(i+1,false);
            circle.add(p);
        }
    }
    public void getIndex(int index,int total)
    {
        int currentIndex=-1;
        for(int t =0;t<total;t++)
        {
            int notRemove=0;
            while(notRemove!=index)
            {
                currentIndex++;
                if(currentIndex==amount)
                {
                    currentIndex=0;
                }
                if(!circle.get(currentIndex).isRemove)
                {
                    notRemove++;
                }
            }
            Person p =circle.get(currentIndex);
            p.setRemove(true);
            circle.set(currentIndex, p);
            System.out.println("第"+(t+1)+"个自杀的人编号为"+p.id+" ");
        }
    }
}
View Code

 

 输出结果:

第1个自杀的人编号为3
第2个自杀的人编号为6
第3个自杀的人编号为9
第4个自杀的人编号为12
第5个自杀的人编号为15
第6个自杀的人编号为18
第7个自杀的人编号为21
第8个自杀的人编号为24
第9个自杀的人编号为27
第10个自杀的人编号为30
第11个自杀的人编号为33
第12个自杀的人编号为36
第13个自杀的人编号为39
第14个自杀的人编号为1
第15个自杀的人编号为5
第16个自杀的人编号为10
第17个自杀的人编号为14
第18个自杀的人编号为19
第19个自杀的人编号为23
第20个自杀的人编号为28
第21个自杀的人编号为32
第22个自杀的人编号为37
第23个自杀的人编号为41
第24个自杀的人编号为7
第25个自杀的人编号为13
第26个自杀的人编号为20
第27个自杀的人编号为26
第28个自杀的人编号为34
第29个自杀的人编号为40
第30个自杀的人编号为8
第31个自杀的人编号为17
第32个自杀的人编号为29
第33个自杀的人编号为38
第34个自杀的人编号为11
第35个自杀的人编号为25
第36个自杀的人编号为2
第37个自杀的人编号为22
第38个自杀的人编号为4
第39个自杀的人编号为35
第40个自杀的人编号为16
第41个自杀的人编号为31

 
 

约瑟夫问题java实现

标签:

原文地址:http://www.cnblogs.com/flyingbee6/p/5095376.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!