每日一练:约瑟夫生者死者小游戏

在这里插入图片描述

1. 问题描述

  约瑟夫问题(Josephus problem)是一个经典的数学和计算机科学问题,源于犹太历史学家弗拉维奥·约瑟夫斯(Flavius Josephus)的著作《犹太战记》。问题的描述如下:
  在这个问题中,有n个人站成一个圈,从1n编号。从第一个人开始,每次数m个人,数到第m个人就将其从圈中删除,然后从下一个人开始重新数,重复这个过程,直到所有人都被删除。问题是,最后剩下的那个人的编号是多少?
  为了解决约瑟夫问题,可以使用递归或迭代的方法。下面是一个简单的递归解法的伪代码:

function josephus(n, m):if n == 1:return 1else:return (josephus(n - 1, m) + m - 1) % n + 1

  这个递归函数的基本思想是:假设已知n-1个人的问题的解,那么在这个基础上,考虑第n个人加入的情况。在每一轮中,我们实际上将问题规模缩小为n-1个人。
  注意,这里的编号是从1开始的,因为在问题的原始描述中,人的编号是从1到n的。在某些变体中,编号可能从0开始,因此在实现时需要注意这一点。

2. 解题思路

  解决约瑟夫问题的一般思路是通过模拟每一轮的删除过程,不断更新当前位置,并在满足终止条件时停止模拟。下面是一种基于迭代的解题思路和设计:
  解题思路

  1. 初始化: 创建一个包含n个人初始编号的列表,并初始化一个变量表示当前位置。
  2. 循环删除过程:
  • 在当前位置开始数m个人。
  • 计算出要删除的人的位置。
  • 从列表中删除该位置的人。
  • 更新当前位置为删除位置。
  1. 终止条件: 当剩下的人数满足终止条件时,停止循环。
  2. 返回结果: 根据具体要求返回结果。在约瑟夫问题中,通常是返回最后剩下的一个人的编号或一组编号。

3. 代码实现

3.1 代码实现一

  30 个人在一条船上,超载,需要 15 人下船。于是人们排成一队,排队的位置即为他们的编号。报数,从 1 开始,数到 9 的人下船。如此循环,直到船上人不能数到9人为止,问剩下的人的编号?

def josephus(n, m):# 创建一个列表,表示n个人的初始编号people = list(range(1, n + 1))# 初始化变量,表示当前位置current = 0# 循环,直到剩下8个人while len(people) > 8:# 计算下一个要删除的人的位置current = (current + m - 1) % len(people)# 删除当前位置的人del people[current]# 返回剩下的最后一个人的编号return people# 示例:有30个人,每次数9个人
result = josephus(30, 9)
print("最后剩下的人的编号是:", result) 

运行效果:

在这里插入图片描述

3.2 代码实现二

  题目修改为:
  30 个人在一条船上,超载,需要 15 人下船。于是人们排成一队,排队的位置即为他们的编号。报数,从 1 开始,数到 9 的人下船。如此循环,直到船上仅剩 15 人为止,问剩下的人的编号?

def josephus(n, m, k):# 创建一个包含n个人初始编号的列表people = list(range(1, n + 1))# 初始化变量,表示当前位置current = 0# 循环,直到剩下的人数满足终止条件while len(people) > k:# 在当前位置开始数m个人,计算出要删除的人的位置current = (current + m - 1) % len(people)# 从列表中删除该位置的人del people[current]# 返回剩下的人的编号return people# 示例:有30个人,每次数9个人删除,直至剩下15个人
result = josephus(30, 9, 15)
print("剩下的人的编号是:", result)

在这里插入图片描述

3.3 代码实现三

  题目修改为:
  30 个人在一条船上,超载,需要 15 人下船。于是人们排成一队,排队的位置即为他们的编号。报数,从 5 开始,数到 9 的人下船。如此循环,直到船上仅剩 15 人为止,问剩下的人的编号?

def josephus_with_start(n, m, k, start):people = list(range(1, n + 1))current = start - 1  # 起始位置while len(people) > k:current = (current + m - 1) % len(people)del people[current]return people# 示例:有30个人,每次数9个人删除,直至剩下15个人,起始位置为5
result = josephus_with_start(30, 9, 15, 5)
print("剩下的人的编号是:", result)

在这里插入图片描述

3.4 代码实现四

  题目修改为:
  30 个人在一条船上,超载,需要 15 人下船。于是人们排成一队,排队的位置即为他们的编号。报数,从 1 开始,数到 9 的人下船,但是每隔一轮人才下船。如此循环,直到船上仅剩 15 人为止,问剩下的人的编号?

def josephus_with_custom_deletion(n, m, k, deletion_rule):people = list(range(1, n + 1))current = 0while len(people) > k:current = deletion_rule(current, m, len(people))del people[current]return people# 示例:有30个人,每次数9个人删除,直至剩下15个人,但是每隔一轮删除一个人
def custom_deletion_rule(current, m, length):return (current + m) % lengthresult = josephus_with_custom_deletion(30, 9, 15, custom_deletion_rule)
print("剩下的人的编号是:", result)

在这里插入图片描述

4.参考:

https://www.runoob.com/python3/python-joseph-life-dead-game.html

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/204650.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp微信小程序中阻止事件冒泡

开发场景:列表中展示地块的数据信息,用户可以点击列表进入地块的详情界面,也可以点击列表中的星星按钮进行收藏 遇到的问题:每次点击星星的时候,都会触发父级的点击事件,从而进入到详情界面 原本的代码&am…

android开发:安卓13Wifi和热点查看与设置功能

近日对安卓热点功能做了一些技术验证,目的是想利用手机开热点给设备做初始化,用的是安卓13,简言之: 热点设置功能不可用,不可设置SSID和密码,不可程序控制开启关闭,网上的代码统统都过时了Loca…

【数据结构】树与二叉树(廿五):树搜索给定结点的父亲(算法FindFather)

文章目录 5.3.1 树的存储结构5. 左儿子右兄弟链接结构 5.3.2 获取结点的算法1. 获取大儿子、大兄弟结点2. 搜索给定结点的父亲a. 算法FindFatherb. 算法解析c. 代码实现 3. 代码整合 5.3.1 树的存储结构 5. 左儿子右兄弟链接结构 【数据结构】树与二叉树(十九&…

ESP32-Web-Server 实战编程-通过网页控制设备多个 GPIO

ESP32-Web-Server 实战编程-通过网页控制设备多个 GPIO 概述 上节 ESP32-Web-Server 实战编程-通过网页控制设备的 GPIO 讲述了如何通过网页控制一个 GPIO。本节实现在网页上控制多个 GPIO。 示例解析 前端设计 前端代码建立了四个 GPIO,如下死 GPIO 2 在前端的…

wmvcore.dll丢失怎么办?解决电脑出现wmvcore.dll丢失问题5个方法

wmvcore.dll缺失5个解决方法与wmvcore.dll丢失原因及文件介绍 引言: 在日常使用电脑的过程中,我们可能会遇到一些错误提示,其中之一就是wmvcore.dll缺失。wmvcore.dll是Windows Media Video编码解码相关动态链接库文件之一,它对…

VR全景技术助力政务服务大厅数字化,打造全新政务服务体验

引言: 随着科技的飞速发展,虚拟现实(VR)技术逐渐走进人们的视野。VR全景技术作为VR领域的一项重要应用,以其沉浸式、交互式的特点,正逐渐渗透到各行各业。政务服务大厅作为相关部门与民众之间的桥梁&#…

Elasticsearch(一)

一:简介 The Elastic Stack, 包括 Elasticsearch、 Kibana(展示数据的项目)、 Beats 和 Logstash(这两个是采集和传输数据的项目) 这些项目组合形成的技术栈称为ELK Stack,能够安全可靠地获取任何来源、任…

Vue框架学习笔记——键盘事件

文章目录 前文提要键盘事件(并不是所有按键都能绑定键盘事件)常用的按键不同的tab和四个按键keyCode绑定键盘事件(不推荐)Vue.config.keyCode.自定义键名 键码 神奇的猜想div标签和click.enterbutton标签和click.enter 前文提要 …

Cesium 展示——地球以及渲染数据导出(下载)为图片或 pdf

文章目录 需求分析新加需求分析第一种方式第二种方式需求 将 Cesium 球体以及渲染数据导出为 jpg/png/pdf 分析 获取场景 scene 信息,转为image 的 octet-stream 流 进行下载为图片 /*** @todo canvas 导出图片* @param {string} dataurl - 地址* @return {Blob}*/ functio…

额,收到阿里云给的赔偿了!

众所周知,就在刚过去不久的11月12号,阿里云突发了一次大规模故障,影响甚广。 以至于连咱们这里评论区小伙伴学校的洗衣机都崩了(手动doge)。 这么关键的双11节点,这么多热门业务和产品,这么大规…

平凯星辰携手教育部教育管理信息中心,助力普惠教育数字化

近日,企业级开源分布式数据库厂商平凯星辰与教育部教育管理信息中心达成合作,TiDB 分布式数据库为全国中小学管理服务平台提供全栈服务。双方将携手深入探索领先的数据库技术在教育行业的新场景与新应用,既夯实教育数字化底座,助力…

DS八大排序之直接插入排序和希尔排序

前言 我们前面几期介绍了线性和非线性的基本数据结构。例如顺序表、链表、栈和队列、二叉树等~!本期和接下来的几期我们来详解介绍各个排序的概念、实现以及性能分析! 本期内容 排序的概念以及其运用 常见的排序算法 直接插入排序 希尔排序 一、排序的…

Zabbix 6 详细安装部署教程

目录 一、安装 MySQL 数据库 二、安装 zabbix 监控平台 三、编辑配置文件 四、启动服务 五、zabbix-web 安装 zabbix web 出图展示乱码问题解决方案 zabbix 的安装部署非常简单,官方提供了四种安装途径,分别是二进制 rpm 包安装方式、源码安装方…

jetson nano 串口通信

目录 1.UART通信介绍 2.电脑端准备工作 2.1 安装串口调试助手 2.2 硬件接线 3.Jetson Nano端准备工作 3.1安装库文件 3.2修改主板上电启动串口权限 4.示例程序-发送及接收 4.1 开启串口调试助手 4.2 导入示例程序 4.3 执行程序 4.4 查看效果 4.4.1 串口调试端 4.4…

西南科技大学信号与系统A实验三(线性连续时间系统的分析)

一、实验目的 1.掌握用 matlab 分析系统时间响应的方法 2.掌握用 matlab 分析系统频率响应的方法 3.掌握系统零、极点分布与系统稳定性关系 二、实验原理 1. 系统函数 H(s) 系统函数:系统零状态响应的拉氏变换与激励的拉氏变换之比. H(s)=R(s)/E(s) 在 matlab 中可采用…

ddns-go部署在linux虚拟机

ddns-go部署ubuntu1804 1.二进制部署 1.虚拟机部署 1.下载linux的x86二进制包 wget https://github.com/jeessy2/ddns-go/releases/download/v5.6.3/ddns-go_5.6.3_linux_x86_64.tar.gz2.解压 tar -xzf ddns-go_5.6.3_linux_x86_64.tar.gz3.拷贝执行文件到PATH下&#xff0c…

【前端】浅谈async/await异步传染性

文章目录 概述观点无法解决可以解决 来源 概述 "异步传染性"问题通常是指,当一个函数使用了async和await,其调用者也需要使用async和await处理异步操作,导致整个调用链都变成异步的。这种情况可能导致代码变得更复杂,不…

全网日志智能聚合及问题根因分析

1 日志关联分析的挑战 随着各行各业数字化转型的不断深入,网络承载了人们日常生活所需的政务、金融、娱乐等多方面的业务系统,已经成为影响社会稳定运行、关系国计民生的重要基础设施资源。哪怕网络发生及其微小的故障,也可能带来难以估量的…

基于C#实现十字链表

上一篇我们看了矩阵的顺序存储,这篇我们再看看一种链式存储方法“十字链表”,当然目的都是一样,压缩空间。 一、概念 既然要用链表节点来模拟矩阵中的非零元素,肯定需要如下 5 个元素(row,col,val,down,right),其中&…

C语言第三十六弹--实现转移表的多种方法

使用C语言通过多种方法实现转移表 方法一、普通法 思路:如图实现多种操作,首先创建菜单,需要运行一次再判断条件,所以通过do{}while(); 循环来实现多次。有多种选择,使用switch case选择语句,再在对应case…