zoukankan      html  css  js  c++  java
  • Josephus问题--N个人通过循环报数决定存活者--基于数组的实现

    在这个问题中,N个人决定通过以下方式减少生存的人数,直至只剩下最后一人。
    他们围坐成一圈(位置记为0到N-1)并从第一个人开始从1报数,报到M的人会被杀死,然后从下一个存活的人又从1开始报数,直到最后一个人留下来。传说中Josephus找到了不会被杀死的位置。编写一个程序,从命令行接收N和M并打印出人们被kill的顺序,同时也找到了幸存者的位置。

    方法一 数组解法

    public class Josephus {
        public static void main(String[] args) {
            int N = Integer.parseInt(args[0]);
            int M = Integer.parseInt(args[1]);
    
            int[] people = new int[N];
            for (int i = 0; i < N; i++) {
                people[i]=i;
            }
            int dead = 0;//死亡人数标记
            int count = 1;//报数标记
            int index= 0;//数组下标标记
            boolean[] isKilled = new boolean[N];//是否被杀死标记,默认false
    
            //不断kill,直至死亡个数达到N-1
            while(dead<N-1) {
                if(count == M) {
                    isKilled[index] = true;
                    dead++;
                    System.out.println(people[index]);//输出被杀死的人的坐标
                    //从下一个存活者开始报数
                    index = (index+1)%N;
                    while (isKilled[index]){
                        index = (index+1)%N;
                    }
                    count = 1;
                }else {
                    //正常报数
                    index = (index+1)%N;
                    if(!isKilled[index]) {
                        count=count+1;
                    }
                }
            }
            //找到幸存者
            for (int i = 0; i < N; i++) {
                if(!isKilled[i])
                    System.out.println(people[i]);
            }
        }
    }
    

    命令行键入java Josephus 7 2
    得到 1 3 5 0 4 2 6

  • 相关阅读:
    Java 装饰者模式
    struts2注解的作用
    XML DOM 笔记
    XMLHttpRequest的用法
    Eclipse中实现JS代码提示功能
    .after()和.before()的关系
    xml的的特殊字符转义&
    html和xml的区别
    dom4j的解析实例
    tld自定义标签系列--使用body-content的作用--比较有用
  • 原文地址:https://www.cnblogs.com/dwwzone/p/12859250.html
Copyright © 2011-2022 走看看