当前位置:编程学习 > JAVA >>

易做图算法之约瑟夫环问题(JAVA)

[java]  
/** 
     * 典故:据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中, 
     *      39个犹太人决定宁愿死也不要被敌人到,于是决定了一个易做图方式,41个人排成一个圆圈,由第1个人 开始报数,每报数到第3人 
     *      该人就必须易做图,然后再由下一个重新报数,直到所有人都易做图身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要 
     *      他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。 
     * @param num 人数 
     * @param per 每多少人抽取一个 
     * @return 约瑟夫环数组 
     */  
public class Josephus {  
    public static int[] arrayOfJosephus(int num, int per) {  
        int[] nums = new int[num];  
        int count =0;  
        int pos = 0;  
          
        for (int i = 1; i <= num; i++) {  
            while(true){  
                pos = pos%num;  
                if (nums[pos]==0) {  
                    count++;  
                }  
                  
                if (count == per) {  
                    count = 0;  
                    break;  
                }  
                  
                pos++;  
            }  
              
            nums[pos] = i;  
        }  
          
        return nums;  
    }  
      
    //约瑟夫环实现  
    public static void main(String[] args) {  
        int manNum = 41;  
        int per = 3;  
        int aliveNum = 3;  
          
        int[] man = Josephus.arrayOfJosephus(manNum, per);  
  
        System.out.println("约琴夫环:"+Arrays.toString(man));  
        System.out.println("L表示3个存活的人要放的位置:");  
          
        for (int i = 0; i < manNum; i++) {  
            if (man[i] > manNum-aliveNum)  
                System.out.print("L");  
            else  
                System.out.print("D");  
  
            if ((i + 1) % 5 == 0)  
                System.out.print("  ");  
        }  
    }  
}  
 
补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,