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

news2024/12/23 18:13:36

在这里插入图片描述

1. 问题描述

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

function josephus(n, m):
    if n == 1:
        return 1
    else:
        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 = 0
    while 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) % length

result = 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.coloradmin.cn/o/1265930.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【古月居《ros入门21讲》学习笔记】13_服务数据的定义与使用

目录 说明: 1. 服务模型 2. 实现过程(C) 自定义服务数据 Person.srv文件内容 Person.srv文件内容说明 编译配置 在package.xml文件中添加功能包依赖 在CMakeLists.txt中添加编译选项 编译生成语言相关文件 创建服务器代码&#xf…

线下渠道应该如何控价

品牌渠道中的问题,大多跟价格有关,比如低价、窜货、假货,治理好这些价格问题,也就是在解决渠道中的低价问题,所以要先了解价格,再进行治理,这样的流程化操作,可以使品牌管控好渠道价…

基于单片机的烟雾检测报警装置(论文+源码)

1.系统设计 (1)利用传感器实现环境中温度、烟雾浓度的实时检测; (2)系统检测的各项数据信息通过液晶模块进行显示,提高设计可视化; (3)系统可以根据实际情况利用按键模…

【AIGC】关于Prompt你必须知道的特性

代码和数据:https://github.com/tonyzhaozh/few-shot-learning 一、实践验证的大模型的特性 1. 大模型的偏差 示例:(文本的情感分析:一句话->P(积极)或者N(消极) Input: I hate this movie. Sentiment: Negativ…

winform 程序多语言

新建一个winform程序添加资源文件 在多语言的资源文件中设置key以及value设置button根据环境选择语言文件 namespace WindowsFormsMulLang {public partial class Form1 : Form{public Form1(){InitializeComponent();}public static ResourceManager rm new ResourceManager(…

重工业ERP包含哪些模块?能为企业带来哪些优势

化工、五金、重型机械制造等重工业行业的经营管理模式存在明显的差别化,企业内部的盘点、发货、接单、报价、委外、排产、派工单、工艺、品检等各业务数据的实时和准确共享有利于企业清晰掌握运作情况,及时制定经营策略,提高对市场变化的反应…

js实现鼠标拖拽

目录 css代码 html代码 js代码 完整代码 效果图: 需求: 鼠标在图片内按下时 图片可以跟随盒子动 鼠标弹起图片停下来 如果图片在box的盒子里面时鼠标弹起了 就把图片展示在box里面 并且让图片回到起始位置 css代码 .div {width: 100px;height: 10…

LeetCode Hot100 739.每日温度

题目: 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。 方法&…

js数组中,相同id的item数据合并

原数据: const list [ {id:1, key: a}, {id:1, key: b}, {id:2, key: c}, {id:2, key: d}, ]期望数据格式 const newList [ {id:1, keyList: [a,b]}, {id:2, keyList: [c,d]}, ]// 相同id的数据合并let newList_(list ).flatten().groupBy(id).map(_.spread((..…

缺省参数的声明和定义

首先,函数缺省参数不能同时出现在声明和定义中,如出现则报错: 声明和定义中同时出现缺省参数 ctrlb,编译报错,提示 “test":重定义默认参数:参数1 编译报错 当函数的声明和定义中都出现…

微信小程序仿网易严选(附精选源码32套,涵盖商城团购等)

商城主要实现的功能 首页、专题、分类、购物车、我的小程序授权登陆获取用户信息首页包含品牌制造页、品牌制造详情页面、新品首发页面、人气推荐页面、各分类列表商品详情页面,包含常见问题、大家都在看商品列表、加入购物车、收藏商品、立即购买、下订单、选择收…

Git删除临时分支

愿所有美好如期而遇 软件开发过程中,总有功能要添加进来,当我们有一个功能开发了一半的时候,产品经理说这个功能不需要了,尽管很无奈,但还是要删除,我开发到一半的分支如何删除呢? 所以需要使用…

unity学习笔记

一、Transform类 在Unity中,Transform 类是一种用于表示和操作游戏对象位置、旋转和缩放的类。每个游戏对象都有一个关联的 Transform 组件,该组件定义了对象在场景中的空间变换信息。 1.常见属性和方法 获取位置 相对与世界坐标系:Debug.…

利用sql语句来统计用户登录数据的实践

目录 1 基本数据情况2 统计每个用户每个月登录次数3 将日期按月显示在列上4 总结 1 基本数据情况 当需要对用户登录情况进行统计时,SQL是一个非常强大的工具。通过SQL,可以轻松地从数据库中提取和汇总数据,并以适合分析和报告的方式进行呈现…

详解Object.defineProperty()方法

Object.defineProperty是一个用于定义或修改对象属性的方法。它提供了一种更底层和灵活的方式来定义属性,可以设置属性的配置(如可枚举性、可配置性、可写性等),并且可以定义属性的getter和setter函数。 语法: Objec…

C语言数据结构之顺序表(上)

前言: ⭐️此篇博文主要分享博主在学习C语言的数据结构之顺序表的知识点时写的笔记,若有错误,还请佬指出,一定感谢!制作不易,若觉得内容不错可以点赞👍收藏❤️,这是对博主最大的认可…

电脑资料删除后如何恢复?3个简单方法轻松恢复文件!

“我平常喜欢在电脑上保存很多学习资料,但由于资料太多,在清理电脑时我可能会误删一些比较有用的资料。想问问大家电脑资料删除后还有机会恢复吗?应该怎么操作呢?” 在数字化时代,很多用户都会选择将重要的文件直接保存…

【算法刷题】Day8

文章目录 202. 快乐数解法: 11. 盛最多水的容器解法: 202. 快乐数 原题链接 拿到题,我们先看题干 把一个整数替换为每个位置上的数字平方和,有两种情况: 重复这个过程始终不到 1(无限死循环)结…

【计算机网络学习之路】序列化,反序列化和初识协议

文章目录 前言一. 序列化和反序列化1.自己实现2. JSON 二. 初识协议结束语 前言 本系列文章是计算机网络学习的笔记,欢迎大佬们阅读,纠错,分享相关知识。希望可以与你共同进步。 本篇博文讲解应用层的序列化和反序列化,还有见一…

笔记:Pika Labs 3D 动画生成工具

Pika Labs 一款3D 动画生成工具 本文地址:https://blog.csdn.net/qq_28550263/article/details/134657306 目 录 1. 简介2. 准备2.1 安装 discord2.2 加入 Discord 频道 3. Pika 使用指南2.1 快速开始2.2 从图像到视频2.3 Pika Bot按钮2.4 提示(Prompt&a…