美文网首页
约瑟夫环

约瑟夫环

作者: 彭于晏我男神 | 来源:发表于2022-03-08 09:54 被阅读0次

在以前初高中参加信息学竞赛的时候,经常会碰到的一个题目叫约瑟夫环。

关于这个问题的详细由来可以在百度进行搜索

在这里简单概述一下问题:

30 个人在一条船上,超载,需要 15 人下船。

于是人们排成一队,排队的位置即为他们的编号。

报数,从 1 开始,数到 9 的人下船。

如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?

在这里我没有使用常见的思路,也就是使用链表来解决,而是通过字典来解决

首先定义一个空字典people={},并对它进行初始化

初始化字典

在这里说明一下,用1代表这个人是还在船上的,而0代表的是这个人已经下船了。

在初始化完成之后我们先做点接下来数数的准备工作:

i:作为索引的计数,范围在1-30,刚开始的时候定义为1,每次移动都+1。如果i到达31则将其赋值变为从1开始进行计数

j:统计有多少人下船,范围在0-15,刚开始的时候定义为0。当j达到15的时候则终止程序

count:每隔多少个人的一个计数器,范围在0-9,刚开始的时候定义为0。当count变成9的时候,所对应的这个人要下船,也就是people{i}=0,同时j就+1,count也重新赋值为0

前期工作准备好之后,来讲讲逻辑思路:

首先设定好两个判断条件:

1)当i=31的时候要重新赋值为1

2)当j=15的时候就结束程序

其次要判断所对应的这个人是否在船上。可能刚开始第一圈还好,但是到后面因为有些人已经下船了,不能把这个空位置也加入进计数里面。如果这个人不在船上,那么索引i就跳过这个位置继续往下数(i+1)

而如果这个人在船上呢?首先肯定是count执行+1数数。

数完之后,我们也要看看是不是已经数到了9个人了:

1)如果还没有到,那么i继续+1往下继续数

2)如果数到的这个人已经是第9个人了,那么,就要将它标记为下船(people{i}=0),用于统计多少个人已经下船的j要+1,并且把对应的号码打印出来。同时不要忘了count要赋值为0,要从头开始数

约瑟夫环代码

而最终的运行结果就是:

最终下船的编号

相关文章

  • 约瑟夫环问题

    约瑟夫环问题约瑟夫环描述:约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围...

  • 循环单链表实现约瑟夫环(C语言)

    约瑟夫环

  • 约瑟夫环

    题目:100名学生围成一个圈, 编号从1到100,从第一名学生开始报数,从1-9报数 每报出9就退出,直到所有学生...

  • 约瑟夫环

  • 约瑟夫环

    问题:1~n个人围成一圈,从1开始报数,每次数到m这个人就出列,问最后剩下的是几号? 做法:递归。 假设剩下的是f...

  • 约瑟夫环

    解法一 用一个list模拟删除过程 解法二 数学公式,推到过程还没看懂

  • 约瑟夫环

    之前去面试的时候遇到这个问题,作为一只算法渣渣,自然带着恐惧的心情,然后自己瞎捣鼓了好长时间终于拼凑出来了一个很菜...

  • 约瑟夫环

  • 约瑟夫环

    复习一下关于约瑟夫环的实现原理: 如果用C来写的话,也会有许多的方法,比如1:采用链表(双向链表)2:递归3:队列...

  • 约瑟夫环

    公式法循环 公式法递归 链表法

网友评论

      本文标题:约瑟夫环

      本文链接:https://www.haomeiwen.com/subject/xnborrtx.html