约瑟夫环

约瑟夫环(队列解法)


队列操作:

每个人都报数一次:可以创建一个计数器,每当报数时计数器+1,(报到9的人就扔进大海),代表:计数器 % 9 ==
0,


/**
 * 约瑟夫环:15个基督教徒和15个非教徒在海上遇险,必须将其中一半的人投入海中,其余的人才能幸免于难,
 * 于是30个人围成一圈,从某一个人开始从1报数,报到9的人就扔进大海,他后面的人继续从1开始报数,重复上面的规则,直到剩下15个人为止。
 * 结果由于上帝的保佑,15个基督教徒最后都幸免于难,问原来这些人是怎么排列的,哪些位置是基督教徒,哪些位置是非教徒。
 * @author zengxin
 *
 */
public class Pahe11约瑟夫环 {

    @Test
    public void ListTest() {
        Queue<Integer> queue = new LinkedList<>();
        int personNum = 30; //总人数
        int liveNum = 15;//基督人数
        int key = 9;//数的关键字

        //初始化人参数
        for(int i = 1;i<=personNum;i++){
            queue.add(i);
        }

        List<Integer> flaseList =  getFlase(queue, personNum, key, liveNum);

        System.out.println();

        Queue<Integer> trueQueue = getTrue(queue, flaseList);

        //遍历出 基督成员
        for(Integer i : trueQueue){
            System.out.print("基:"+i+" ");
        }


    }


    //获取非基督人员
    private static List<Integer>  getFlase(Queue<Integer> queue,int personNum,int key,int liveNum){


        List<Integer> flaseList = new ArrayList<>();//非基督徒人员

        int count =0; 
        while(queue.size()>liveNum){
            //出队操作
            int k = queue.poll();

            //计数器
            count++;

            if(count % key == 0){
                System.out.print("非:"+k+" ");
                flaseList.add(k);

            }else{
                //当不满足时,继续入栈
                queue.add(k);
            }
        }

        return flaseList;

    }

    //移除非基督成员
    private Queue<Integer> getTrue(Queue<Integer> queue,List<Integer> flaseList){


        for(Integer i : flaseList){
            queue.remove(i);

        }
        return queue;

    }

image_1c5lgsast1u3a3df1vs9138e1v5u9.png-18.3kB

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值