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

  • 相关阅读:
    Codeforces 1137E 凸包
    Codeforces 1142D Foreigner (DP)
    Codeforces 1120C Compress String(DP)
    gym
    Codeforces 1142B Lynyrd Skynyrd
    PTA 估值一亿的AI核心代码
    HDU 6162 树链剖分
    洛谷P2146 树链剖分
    HTTP深入浅出http请求(转)-----http请求的过程和实现机制
    css实现不定宽高的div水平、垂直居中
  • 原文地址:https://www.cnblogs.com/dwwzone/p/12859250.html
Copyright © 2011-2022 走看看