1.介绍

Josephu问题为:设编号为1、2、...n的n个人围坐在一圈,约定编号为k(1<=k<=n) 的人从1开始报数,

数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,以此类推,直到所有人都出列为止,由此产生出一个出列编号的序列。

2.提示

用一个不带头节点的循环链表来处理Josephu问题:先构成一个有n节点的单向循环链表,

然后由k节点起从1开始计数,计到m时,对应节点从链表中删除,然后再重被删除节点的下一个节点又从1开始计数,直到最后一个节点从链表中删除算法结束

3.示意图

4.环形链表示意图

5.思路分析图

6.代码实现

    public class Boy
{
public Boy(int id)
{
this.Id = id;
}
public int Id { get; set; } public Boy Next { get; set; }
}
    public class CircleSingleLinkList
{
private Boy _first = null; public void Add(int nums)
{
if (nums < ) Console.WriteLine("传入的值必须大于1");
else
{
Boy curBoy = null; for (int i = ; i <= nums; i++)
{
Boy boy = new Boy(i); if (i == )
{
_first = boy;
_first.Next = _first; //构成环形
curBoy = _first; //让当前boy等于第一个小孩
} else
{
curBoy.Next = boy; //指向当前小孩的下一个
boy.Next = _first; //待添加的小孩的下一个节点指向第一个
curBoy = boy;//再把当前小孩指向待添加节点
}
}
}
} /// <summary>
/// 根据用户的输入,计算出小孩出圈的顺序
/// </summary>
/// <param name="startId">表示从第几个小孩开始数数</param>
/// <param name="countNum">表示数几下</param>
/// <param name="nums">表示最初由几个小孩在圈中</param>
public void CountBoy(int startId,int countNum,int nums)
{
if (startId < || startId > nums || _first == null)
{
Console.WriteLine("参数错误请重新输入"); return;
} Boy helper = _first; //创建一个辅助节点 //将辅助节点指向最后一个节点
while (true)
{
if (helper.Next == _first) break; //当辅助节点的下一个节点等于第一个节点 说明是最后一个节点 helper = helper.Next;
} //将开始节点和辅助节点指向开始数数的位置和结尾 由于索引是从0开始所以是startId-1
for (int j = ; j < startId- ; j++)
{
_first = _first.Next;
helper = helper.Next;
} //当小孩报数时,让first和helper同时移动 countNum-1次,然后出圈
while (true)
{
if (helper == _first) break; //当尾结点等于头节点时 说明只有一个节点 for (int i = ; i < countNum-; i++)
{
_first = _first.Next;
helper = helper.Next;
} //first就代表出圈的小孩
Console.WriteLine($"出圈的小孩:{_first.Id}"); _first = _first.Next; //将first指向小孩节点出圈
helper.Next = _first;
}
Console.WriteLine("最后留下的小孩:"+_first.Id);
}
    public class Josephu
{
public static void Test()
{
CircleSingleLinkList singleLinkList = new CircleSingleLinkList(); singleLinkList.Add(); singleLinkList.ShowBoy(); singleLinkList.CountBoy(, , );
}
}

7.效果演示图

C#数据结构与算法系列(七):约瑟夫问题(Josephu)的更多相关文章

  1. javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例

    栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...

  2. Java数据结构和算法(七)B+ 树

    Java数据结构和算法(七)B+ 树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 我们都知道二叉查找树的查找的时间复杂度是 ...

  3. 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解

    数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...

  4. 数据结构与算法系列2 线性表 链表的分类+使用java实现链表+链表源码详解

    数据结构与算法系列2.2 线性表 什么是链表? 链表是一种物理存储单元上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表的链接次序实现的一系列节点组成,节点可以在运行时动态生成,每个节点包括两个 ...

  5. 数据结构与算法系列研究七——图、prim算法、dijkstra算法

    图.prim算法.dijkstra算法 1. 图的定义 图(Graph)可以简单表示为G=<V, E>,其中V称为顶点(vertex)集合,E称为边(edge)集合.图论中的图(graph ...

  6. 数据结构与算法系列——排序(4)_Shell希尔排序

    1. 工作原理(定义) 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.但希尔排序是非稳定排序算法. 希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入 ...

  7. 看图轻松理解数据结构与算法系列(NoSQL存储-LSM树) - 全文

    <看图轻松理解数据结构和算法>,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握.本系列包括各种堆.各种队列.各种列表.各种树.各种图.各种排序等等几十篇的样子. 关于LSM树 ...

  8. 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

    树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构.    a.树是n ...

  9. 数据结构与算法系列----AC自己主动机

    一:概念 首先简要介绍一下AC自己主动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之中的一个.一个常见的样例就是给出n个单词,再给出一段 ...

  10. 数据结构与算法系列----最小生成树(Prim算法&amp;Kruskal算法)

     一:Prim算法       1.概览 普里姆算法(Prim算法).图论中的一种算法.可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中.不但包含了连通图里的全部顶点(英语:Ve ...

随机推荐

  1. wordpress评论回复邮件通知功能

    安装插件登录后台——点击“插件”——“安装插件”——按关键字搜索“Comment Reply Notification”——点击“现在安装”安装好后启用插件.如下图所示: 配置Comment Repl ...

  2. NO.4 CCS运行第一个demo(本地)

    前面介绍了基本的SDK内容,这次主要是本地实际应用CCS实现程序的运行. 首先我们进入CCS,我简单介绍下界面: 界面很简洁,通俗易懂(怎么跟STM32IDE这么像) 由于我们还不会写程序,我们先导入 ...

  3. linux高级管理第十二章--rsync

    实验部分 1.安装rsync 2.配置文件 3.配置密码 4.后续 5.为了测试,创建几个文件 配置实时同步 1.调整inotify内核参数 安装inotify-tools 测试同步 编写脚本 验证 ...

  4. MySQL/MariaDB随笔二

    mariaDB的二进制安装:系统版本和MariaDB版本 [root@ ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@ ~ ...

  5. JavaScript实现树深度优先和广度优先遍历搜索

    1.前置条件 我们提前构建一棵树,类型为 Tree ,其节点类型为 Note.这里我们不进行过多的实现,简单描述下 Note 的结构: class Node{ constructor(data){ t ...

  6. NetCore项目实战篇08---Docker挂载mysql并连接.netCoreWeb

    我们的项目之前在直接连接的mysql,今天我们将通过docker挂载mysql 并与我们开发的webapi项目连接. 1. 安装docker 下载地址: https://download.docker ...

  7. php序列化和反序列化学习

    1.什么是序列化 序列化说通俗点就是把一个对象变成可以传输的字符串. 1.举个例子,不知道大家知不知道json格式,这就是一种序列化,有可能就是通过array序列化而来的.而反序列化就是把那串可以传输 ...

  8. java eclipse tomcat

    Port 8080 required by Tomcat v9.0 Server at localhost is already in use. The server may already be r ...

  9. ActiveMQ 笔记(一)概述与安装

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.消息中间件的产生背景 1.前言:考虑消息中间件的使用场景? 在何种场景下需要使用消息中间件 为什么要 ...

  10. Java实现 蓝桥杯VIP 算法训练 P1101

    有一份提货单,其数据项目有:商品名(MC).单价(DJ).数量(SL).定义一个结构体prut,其成员是上面的三项数据.在主函数中定义一个prut类型的结构体数组,输入每个元素的值,计算并输出提货单的 ...