算法-巧解约瑟夫环问题

题目:

约瑟夫环问题起源于一个犹太故事。约瑟夫环问题的大意如下

罗马人攻占了桥塔帕特,41个人藏在一个山洞中躲过了这场浩劫。这41个人中,包括历史学家约瑟夫和他的一个朋友。剩余的39个人为了表示不向罗马人屈服,决定集体自杀。大家决定了一个自杀方案,所有这41个人围成一个圆圈,由第1个人开始顺时针报数,每报数为3的人就立刻自杀,然后再由下一个人继续报数,仍然是每报数为3的人就立刻自杀……,直到所有人都自杀身亡为止。

约瑟夫并不想自杀,于是约瑟夫想到了一个计策,最后躲过了自杀。请问,他是怎么做到的?(这里写的是只剩约瑟夫一人)

解法一:数学大法,公式计算

 

举个例子:如果n(n>2)个人参与自杀,数到m的人自杀的话,按照公式lastnumber=(lastnumber+killnumber)%2(初始化状态下lastnumber=0)

 

import java.util.ArrayList;
public class Demo{
    public static void main(String[]args) {    
    ArrayList<Integer>str=new ArrayList<Integer>();
    for(int i=1;i<=3;i++)        
    str.add(i);        
    int lastnumber=0,killnumber=3;//killnumber为喊到这个number的人自杀    
    for(int i=2;i<=str.size();i++)        
    lastnumber=(lastnumber+killnumber)%i;    
    System.out.println(str.get(lastnumber));//实际编号 
    System.out.println(lastnumber);//list编号                                  
 }
}

解法二:往死里加方法

思路:num++和index++,比如,killnumber=3,用取余符号控制,满3就remove,index注意控制不要超出size

 

import java.util.ArrayList;
public class Demo1{    
public static void main(String[]args) {    
ArrayList<Integer>str=new ArrayList<Integer>();    
    for(int i=1;i<=41;i++)   
 {        str.add(i);    }    
    int num=1,index=0;//值和索引    
    while(str.size()>1)    
{   
     if(num%3==0)
    {
        str.remove(index);
        index--;    
    }        
        num++;
        index++; 
        index%=str.size();//防止index超过范围,到达极限就归0    
}    
    System.out.println(str.get(0)); 

}   
}
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值