• 约瑟夫问题


    package cn.java.project.Josephus;
    
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Scanner;
    
    /**
     * 丢手帕(约瑟夫)问题
     * 
     * 具体问题:设编号为1,2,3....n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始
     * 报数,数到m的那个人出列,它的下一位从一开始报数,报到m的那个人又出列,以此类推, 直到所有人出列为止,如此产生一个出列编号的序列...
     * 
     * 思路: 1.要将n个人连成一圈 可以用集合表示 选LinkedList 2.先将n个人放进集合中
     *         3.先从第1个开始报数,那么第一个出列的肯定是m%n,剩下就是n-1个人,再从m+1开始报数
     *
     */
    public class Josephus {
    
    	public static void main(String[] args) {
    		method_01();
    	}
    
    	public static void method_01() {
    		System.out.println("请输入有几个人参加游戏:");
    		Scanner input = new Scanner(System.in);
    		int n = input.nextInt();
    		List<Integer> member = new LinkedList<Integer>();
    		for (int i = 1; i <= n; i++) {
    			member.add(i);
    		}
    		System.out.println("请选择从第几个人开始报数:");
    		int k = input.nextInt();
    		System.out.println("请说明到报数到第几个人出列:");
    		int m = input.nextInt();
    		while (!member.isEmpty()) {
    			// k的索引位置
    			k = k + m;
    			// 那m的索引位置
    			k = k % member.size() - 1;
    			//判断是否到末尾
    			if (k < 0) {
    				System.out.println(member.get(member.size() - 1));
    				member.remove(member.size() - 1);
    				k = 0;
    			} else {
    				System.out.println(member.get(k));
    				member.remove(k);
    			}
    		}
    	}
    
    }
    
  • 相关阅读:
    BZOJ 3085: 反质数加强版SAPGAP
    BZOJ 1053 [HAOI2007]反素数ant
    强化学习一:Introduction Of Reinforcement Learning
    BZOJ 2120: 数颜色
    2018暑假多校(杭电 + 牛客)
    算法笔记--可持久化线段树
    牛客练习赛22 简单瞎搞题
    BZOJ 1047: [HAOI2007]理想的正方形
    算法笔记--二项式反演
    BZOJ 1010: [HNOI2008]玩具装箱toy
  • 原文地址:https://www.cnblogs.com/bingzhikun/p/4705687.html
Copyright © 2020-2023  润新知