zoukankan      html  css  js  c++  java
  • 约瑟夫环简介,问题以及java实现

    问题:一群猴子排成一圈,按1,2,…….,n依次编号。然后从第一只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,再把它踢出去………………….,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求:输入m,n,输出最后的那个大王的编号。
    很明显,这是一个约瑟夫环的问题,它的特征如下:
    1、一群人围在一起坐成环状(例如N个人)
    2、从某个编号开始报数(如:K)
    3、数到某个数(如:M)的时候,此人出列,下一个人重新报数
    4、一直循环,直到所有人出列[3] ,约瑟夫环结束

    知道了它的原理,那么我们解决起来也就有针对性了。代码如下:

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    
    public class josephus {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入总的数目:");
            int totalNum = sc.nextInt();
            System.out.println("请输入报数的编号:");
            int cycleNum = sc.nextInt();
            jsoephus_func(totalNum,cycleNum);
        }
    
        private static void jsoephus_func(int totalNum, int cycleNum) {
               //定义链表
            List<Integer>  list = new ArrayList<Integer>();//初始的人数
            List<Integer>  resultlist = new ArrayList<Integer>();//点到人
            for(int i=1;i<=totalNum;i++){//把所有的猴子的编号都保存到链表中去
                list.add(i);
            }
            int count = 0;
            for(int j =0;j<totalNum;j++){
                count = (--count+cycleNum)%list.size();
                //System.out.print(list.get(count));//将选中的每一个猴子的编号都打印出来
                resultlist.add(list.remove(count));//将点到的每一个猴子的编号都保存到链表中,最后一个即是我们想要的答案
            }
            System.out.println(resultlist.get(resultlist.size()-1));//打印出最后一个点到猴子的编号
        }
    
    }
    

    结果显示如下:
    这里写图片描述

    说明:
    输入8,表示总共有8只猴子,输入2,表示踢出猴子的编号是从2开始的。
    首先是编号为2的猴子,然后是编号4,编号6,编号8,编号3,编号7,编号5,最后剩下的就是编号1了。
    可以把整个踢出过程打印出来,显示如下:
    这里写图片描述

    当然啦,这个也可以用递归来做。具体怎么做,这里就不在介绍了,若有兴趣,可自行百度。

  • 相关阅读:
    【51nod1965】奇怪的式子
    【spoj】DIVCNTK
    【bzoj3173】最长上升子序列
    【UOJ 209】【UER #6】票数统计
    Fib数列2 费马小定理+矩阵乘法
    T37302 P哥的桶
    U32592 摘果实
    【loj6029】「雅礼集训 2017 Day1」市场&&【uoj#228】基础数据结构练习题
    【bzoj4631】踩气球 线段树
    [bzoj4922]Karp-de-Chant Number
  • 原文地址:https://www.cnblogs.com/cmderq/p/9130850.html
Copyright © 2011-2022 走看看