zoukankan      html  css  js  c++  java
  • 约瑟夫及相似问题的解法

    关乎约瑟夫问题的理解与解法

    约瑟夫问题的变形以及相关问题

    约瑟夫问题介绍

    1. 约瑟夫问题的产生是据说著名犹太历史学家josephus有过以下的故事:罗马人占领侨塔帕特后,39个 犹太人与josephus和他的朋友躲到一个洞中,39个犹太人决定先后自杀从而不用被敌人抓到,决定了一个自杀方法,所有人围成一个圈,由第一个人开始报数,每报数到第三个该人就必须自杀,随后从此人后面一位重新开始报数,josephus和他的朋友并不像遵从,于是josephus和他的朋友先假装遵从,随后站在了第16个和31的位置上,免去了性命之忧。这就是著名的约瑟夫问题。
    2. 现如今很多关于这种背景的思维题,比如报数出列,出列后从下一位继续报数,直到剩余两位成为诱饵,其他人为猎手等的军事游戏,还是猴子争王的背景题...在这些题目的背后都是这样一种运行规则:

    约瑟夫问题的解决

    1. 首先这种问题的背景都是,由总数为N的单位围成一个圈,以q为一个小单位不断循环,第q个除去,随后继续循环,直到最后剩余(q-1)个单位停止。
    2. 首先以最原始的约瑟夫问题来看:(41个人轮番自杀)
    • 首次41个人按0-40的编号排成一个圆圈,此时的话第41个加一应该注意跳转成0。如下图:

    • 首先定义一个长度为41的数组,随后定义一个计数变量来统计剩余的人数,初始化为41个人,随后用step来表示报数,定义一个编号index。然后就可以用同种的循环语句来实现了。主要就是当''' i++ = 40;'''就应该让其回到第一个位置0上去。从而达到转圈的目的。每次去除一个人之后计数变量自减1。循环结束后遍历数组找出存活的人的编号。

    1. 所以根据 这种方法,对于相关性的问题,index 为下标,q为循环单位的N个元素,count为剩余元素应该是'''index = (index+1)%count'''。
  • 相关阅读:
    Spring Boot
    Spring Boot – Jetty配置
    如何使ESLint在Visual Studio 2019和2017中工作: 2019 v16和2017> = v15.8
    CentOS 7 安装 Nginx
    HTTPS-使用Certbot自动配置Let’s Encrypt证书
    centos7升级内核到最新版本
    [C#.net]Connection Timeout和Command Timeout
    Redis中切换db
    Redis 模糊查询删除操作
    [Abp vNext 源码分析]
  • 原文地址:https://www.cnblogs.com/whl-lin/p/9997139.html
Copyright © 2011-2022 走看看