数据结构总结系列(三)——循环链表之约瑟夫问题

约瑟夫问题简介:

约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。

分析:

(1)由于对于每个人只有死和活两种状态,因此可以用布朗型数组标记每个人的状态,可用true表示死,false表示活。

(2)开始时每个人都是活的,所以数组初值全部赋为false。

(3)模拟杀人过程,直到所有人都被杀死为止。

(由于博主懒癌犯了导致随便截取了某度百科的内容,或许更新之后会用这种方法呢~~~)

我们现在确定了使用循环链表,那么就开始定义:

由于循环链表尾部指针指向头部,所以循环链表的定义和单链表一致,只有表示时有些许差别。

show code:

typedef struct node
{
    int data;
    struct node *next;//指向下一个节点
}LinkNode;

typedef LinkNode *RollList;//重定义了循环链表的头节点

插入:

void Creat(RollList &R,int length)
{
    RollList tmp=R;//这里修改了tmp,避免直接对头结点修改
    for(int i=2;i<=length;i++)//由于确定了每个节点的数据,单独将第一个节点拿出来定义
    {
        LinkNode *L=new LinkNode;
        L->data=i;
        L->next=R;
        tmp->next=L;//这里的插入也很简单
        tmp=tmp->next;
    }
}

Kill的函数:

void Kill(RollList &R,int m,int length)
{
    RollList tmp=R;
    for(int i=1;i<=length-1;i++)//循环n-1次。
    {
        for(int j=1;j<=m-2;j++)//这里首先走到要删除节点的前一个节点
        {
            tmp=tmp->next;
        }
        cout << "Kill the " << tmp->next->data << "people " << endl;
        tmp->next=tmp->next->next;//这里对指针进行修改(直接跳过了删除节点)
        tmp=tmp->next;
    }
    cout << endl;
    cout << "Survive people :" << endl;
    cout << tmp->data << endl;
}

那么,我们的约瑟夫问题已经可以求解了:

直接上代码:

#include <bits/stdc++.h>

using namespace std;

int arr[200];

typedef struct node
{
    int data;
    struct node *next;//指向下一个节点
}LinkNode;

typedef LinkNode *RollList;//重定义了循环链表的头节点

void Creat(RollList &R,int length)
{
    RollList tmp=R;//这里修改了tmp,避免直接对头结点修改
    for(int i=2;i<=length;i++)//由于确定了每个节点的数据,单独将第一个节点拿出来定义
    {
        LinkNode *L=new LinkNode;
        L->data=i;
        L->next=R;
        tmp->next=L;//这里的插入也很简单
        tmp=tmp->next;
    }
}

//下面的注释代表了另一种显示存活的人的方法(快排是真的牛皮)
/*void Kill(RollList &R,int m,int length,int arr[])
{
    RollList tmp=R;
    for(int i=1;i<=length-1;i++)//循环n-1次。
    {
        for(int j=1;j<=m-2;j++)
        {
            tmp=tmp->next;
        }
        cout << "Kill the " << tmp->next->data << "people " << endl;
        arr[i]=tmp->next->data;
        tmp->next=tmp->next->next;
        tmp=tmp->next;
    }
}*/

void Kill(RollList &R,int m,int length)
{
    RollList tmp=R;
    for(int i=1;i<=length-1;i++)//循环n-1次。
    {
        for(int j=1;j<=m-2;j++)//这里首先走到要删除节点的前一个节点
        {
            tmp=tmp->next;
        }
        cout << "Kill the " << tmp->next->data << "people " << endl;
        tmp->next=tmp->next->next;//这里对指针进行修改(直接跳过了删除节点)
        tmp=tmp->next;
    }
    cout << endl;
    cout << "Survive people :" << endl;
    cout << tmp->data << endl;
}

int main()
{
    RollList R=new LinkNode;
    R->data=1;
    R->next=R;
    int length,m;
    cout << "input people :" << endl;
    cin >> length;
    Creat(R,length);
    cout << "input death :" << endl;
    cin >> m;
    cout << endl;
    /*Kill(R,m,length,arr);
    cout << "Survive people :" << endl;
    sort(arr,arr+length);
    for(int i=1;i<=length-1;i++)
    {
        if(arr[i]!=i)
        {
            cout << i << endl;
            break;
        }
    }*/
    Kill(R,m,length);
    return 0;
}

不得不说(快排牛皮!!!!)

偷偷说一下(或许之后会有另一种方法求解约瑟夫问题,但是懒癌博主不知何时会更新,不过快放假了呢~~)

原文地址:https://www.cnblogs.com/ever17/p/10959304.html

时间: 2024-10-28 15:29:12

数据结构总结系列(三)——循环链表之约瑟夫问题的相关文章

【数据结构&amp;&amp;算法系列】KMP算法介绍及实现(c++ &amp;&amp; java)

KMP算法如果理解原理的话,其实很简单. KMP算法简介 这里根据自己的理解简单介绍下. KMP算法的名称由三位发明者(Knuth.Morris.Pratt)的首字母组成,又称字符串查找算法. 个人觉得可以理解为最小回溯算法,即匹配失效的时候,尽量少回溯,从而缩短时间复杂度. KMP算法有两个关键的地方,1)求解next数组,2)利用next数组进行最小回溯. 1)求解next数组 next数组的取值只与模式串有关,next数组用于失配时回溯使用. 在简单版本的KMP算法中,每个位置 j 的 n

(java描述)关于链表的代码-----单双、循环链表、约瑟夫环、多项式相加

将链表头尾倒置 将几个链表合并成一个新的链表,将链表中重复的节点去掉,并按大小排序 双向循环链表 单向循环链表(约瑟夫循环) 多项式相加 程序源代码 单链表.单向循环链表结点类 package javab; public class Node { int data; Node next; public Node(int data){ this.data=data; } } 第一题代码: package javab; import java.util.Scanner; public class I

[转]C# 互操作性入门系列(三):平台调用中的数据封送处理

传送门 C#互操作系列文章: C#互操作性入门系列(一):C#中互操作性介绍 C#互操作性入门系列(二):使用平台调用调用Win32 函数 C#互操作性入门系列(三):平台调用中的数据封送处理 C#互操作性入门系列(四):在C# 中调用COM组件 本专题概要 数据封送介绍 封送Win32数据类型 封送字符串的处理 封送结构体的处理 封送类的处理 小结 一.数据封送介绍 看到这个专题时,大家的第一个疑问肯定是--什么是数据封送呢?(这系列专题中采用假设朋友的提问方式来解说概念,就是希望大家带着问题

C# 互操作性入门系列(三):平台调用中的数据封送处理

好文章搬用工模式启动ing ..... { 文章中已经包含了原文链接 就不再次粘贴了 言明 改文章是一个系列,但只收录了2篇,原因是 够用了 } --------------------------------------------------------------------------------------- C#互操作系列文章: C#互操作性入门系列(一):C#中互操作性介绍 C#互操作性入门系列(二):使用平台调用调用Win32 函数 C#互操作性入门系列(三):平台调用中的数据封

2018-2019-1 20172316 《程序设计与数据结构》第三周学习总结

20172316 2017-2018-2<程序设计与数据结构>第三周学习总结 教材学习内容总结 第五章 队列 队列是一种线性结构,队列元素按照FIFO方式处理. 队列和栈十分相似,所以只需要学习好前面两个章节就可以有效地理解"队列"的基本概念了. 其方法的功能上可以大概地一一对应起来 push-->enqueue pop-->dequeue peek-->first 所以在最后通过链表.数组来实现队列的问题和实现栈也非常类似,实现起来非常轻松. 值得注意的

Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送

Android高效率编码-第三方SDK详解系列(三)--JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送 很久没有更新第三方SDK这个系列了,所以更新一下这几天工作中使用到的推送,写这个系列真的很要命,你要去把他们的API文档大致的翻阅一遍,而且各种功能都实现一遍,解决各种bug各种坑,不得不说,极光推送真坑,大家使用还是要慎重,我们看一下极光推送的官网 https://www.jpush.cn/common/ 推送比较使用,很多软件有需要,所以在这个点拿出来多讲讲,我们本节

Exchange 2013SP1和O365混合部署系列三

继续,基本上大多数都是截图,在某些地方,会有一些提示. 下面就是和本地域进行同步,主要用到的是Dirsync工具. 全都是下一步. 继续下一步. 继续下一步. 这里输入的就是O365的管理员账号.也就是当时注册的那个. 本地管理员账号. 继续下一步. 开始自动配置. 开始同步本地的账户.到WAAD. 图上我们可以看到同步状态. 继续下面的操作,激活已同步的用户. 根据需要选择. 有印象没?安装同步工具的时候选的那个密码同步的选项. 先到这吧,下篇开始在本地Exchange 2013 SP1上配置

Spring Data 系列(三) Spring+JPA(spring-data-commons)

本章是Spring Data系列的第三篇.系列文章,重点不是讲解JPA语法,所以跑开了JPA的很多语法等,重点放在环境搭建,通过对比方式,快速体会Spring 对JPA的强大功能. 准备代码过程中,保持了每个例子的独立性,和简单性,准备的源码包,下载即可使用.如果,对JPA语法想深入研究的话,直接下载在此基础上进行测试. 前言 Spring Data 系列(一) 入门:简单介绍了原生态的SQL使用,以及JdbcTemplate的使用,在这里写SQL的活还需要自己准备. Spring Data 系

COJ 0970 WZJ的数据结构(负三十)树分治

WZJ的数据结构(负三十) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,点和边上均有权值.请你设计一个数据结构,回答M次操作. 1 x v:对于树上的每一个节点y,如果将x.y在树上的距离记为d,那么将y节点的权值加上d*v. 2 x:询问节点x的权值. 输入 第一行为一个正整数N.第二行到第N行每行三个正整数ui,vi,wi.表示一条树边从ui到vi,距离为wi.第N+1行为一个正整数M.最后

Cocos2d-x创建android项目(cocos2d-x系列三)

不例外.最显眼的就是,在文件的根目录中增加了一个名为setup.py的配置文件.运行它可以配置系统的一些环境变量. 2.创建项目 新的版本我们来动手创建一个新项目吧.找到tools文件夹....额 打包的那个名为create-project.py的文件似乎木有了!原来,在新版本中,创建新项目已经可以通过命令行来创建了,相对于先前版本的图形界面,命令行更简洁.我们要在setup.py中设置参数.以mac平台为例,我们进入到对应目录,运行脚本setup.py: Setting up cocos2d-