C语言 | 约瑟夫问题(猴王争夺战)

news2024/11/23 15:38:44

约瑟夫问题(单向循环链表的使用)

         约瑟夫问题有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。下面我们将用猴子争大王这一故事以及采用单向循环链表这一方法来进行讲解这一问题。

        设编号为1,2,……n得n个猴子围坐一圈,约定编号为k(k大于等于1并且小于等于n),从1开始报数,数到m的猴子被淘汰。它的下一位继续从1开始报数,数到m的猴子被淘汰,依次类推,最后剩下一个为猴王。

1、根据下图展示,初始化状态:假设n=6,总共有6个人,k=1,从第一个猴开始报数,m=5,每次数五个。

2、第一次报数:从一号开始,数五个数,1-2-3-4-5,数完五个数,五号被淘汰,第一次报数后,剩余猴的数量如下。

3、第二次报数:从被淘汰的五号的下一位开始报数,也就是六号,数五个数,6-1-2-3-4,数数完毕,四号被淘汰,第二次报数后,剩余猴的数量如下。

4、第三次报数:从被淘汰的四号的下一位开始报数,同样是六号,数五个数,6-1-2-3-6,数数完毕,六号被淘汰,第三次报数后,剩余猴的数量如下。

5、第四次报数:从被淘汰的六号的下一位开始报数,也就是一号,数五个数,1-2-3-1-2,数数完毕,二号被淘汰,第四次报数后,剩余猴的数量如下。

6、第五次报数:从被淘汰的二号的下一位开始报数,也就是三号,数五个数,3-1-3-1-3,数数完毕,三号被淘汰,只剩下一号,那么1号就为猴王。

     


       本程序是有关线性表的链式存储结构的应用,通过C语言中提供的结构指针来存储线性表,利用malloc函数动态地分配存储空间。
       约瑟夫环的大小是变化的,因此相应的结点也是变化的,使用链式存储结构可以动态的生成其中的结点,出列操作也非常简单。用单向循环链表模拟其出列顺序比较合适用结构指针描述每个猴:

typedef struct node_t

{

char data;        //数据域

struct node_t *next;     //指针域 ,指针指向自身结构体的类型(存放的下一个节点的地址)

}link_node_t,* link_list_t;   //结构体数据类型,结构体指针类型


struct node_t《-》link_node_t

struct node_t * 《-》link_list_t《-》link_node_t *

解决问题的完整代码如下:

#include <stdio.h>
#include <stdlib.h>
typedef struct node_t
{
    int data;
    struct node_t *next;
}link_node_t,*link_list_t;

int main(int argc, const char *argv[])
{
    link_list_t h=NULL;    //用于指向头结点
    link_list_t pdel=NULL;    //用于指向被删除节点
    link_list_t ptail=NULL;   //用于指向当前链表的尾
    link_list_t pnew=NULL;    //用于指向新创建的节点
    int kill_num;             //数到几淘汰猴子
    int start_num;            //从几号猴子开始
    int all_sum;              //总数
    printf("please input monkey all_sum:");
    scanf("%d",&all_sum);
    printf("please input start_num:");
    scanf("%d",&start_num);
    printf("please input monkey kill_num:");
    scanf("%d",&kill_num);

    h=(link_list_t)malloc(sizeof(link_node_t));
    if(h==NULL)
    {
        printf("error");
        return -1;
    }
    h->data=1;
    h->next=NULL;
    ptail=h;         //尾指针指向当前第一个节点
    for(int i=2;i<=all_sum;i++)
    {

        pnew=(link_list_t)malloc(sizeof(link_node_t));          
        if(pnew==NULL)  //创建新节点
        {
            printf("error");
            return -1;
        }

        pnew->data=i;     //为新节点赋值
        pnew->next=NULL;

        ptail->next=pnew;   //将新节点连接到链表尾部
        ptail=pnew;         //尾指针跟随移动到尾部

    }

    ptail->next=h;           //将头指针保存到链表尾部,形成单向循环链表


    //开始淘汰猴子 
    for(int i=0;i<start_num-1;i++)   //将头指针移动到开始的猴子号码处
        h=h->next;
	//循环进行淘汰猴子
    while(h!=h->next)  //条件不成的时候,就剩一个猴子,只有一个节点  
    {
        for(int i=0;i<kill_num-2;i++)     //将头指针移动到即将删除节点的前一个节点
            h=h->next;

        pdel=h->next;
        h->next=pdel->next;                  //跨过删除节点
        printf("kill %d\n",pdel->data);      //打印被淘汰的猴子
        free(pdel);
        pdel=NULL;
        h=h->next;   //淘汰该猴子后,从下一个节点开始继续开始数,将头指针移动到开始数的地方
    }
    printf("king is %d\n",h->data);         //国王诞生


    return 0;
}
                                                                

运行结果如下:

please input monkey all_sum:6 
please input start_num:1
please input monkey kill_num:5
kill 5
kill 4
kill 6
kill 2
kill 3
king is 1

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

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

相关文章

Lazysysadmin靶机渗透过程

准备工作 下载好靶机到本地后 VMware导入OVA 启动靶机 扫描信息 首先扫描整个C段发现主机 进一步扫描端口 从扫描结果可知&#xff1a; Samba服务MySQLSSH端口网站端口 先对网站进行目录遍历 发现有wordpress网站和phpmyadmin管理系统 出现了非常多遍My name is togie.可能…

Leetcode171. Excel 表列序号

Every day a leetcode 题目来源&#xff1a;171. Excel 表列序号 解法1&#xff1a;数学 168. Excel表列名称的逆向题目。 本题实质上是特殊的 26 进制。 A ~ Z对应1 ~ 26。 假设 A 0&#xff0c;B 1&#xff0c;…&#xff0c;那么 AB 261 * 0 260 * 1。 而这里是A…

二叉搜索树中的搜索

1题目 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则返回 null 。 示例 1: 输入&#xff1a;root [4,2,7,1,3], val 2 输出&#xff1…

[计算机图形学]材质与外观(前瞻预习/复习回顾)

一、图形学中的材质 不同的物体表面有着不同的材质&#xff0c;而不同的材质意味着它们与光线的作用不同。那么我们之前在介绍辐射度量学和渲染方程提到过其中一个函数&#xff0c;叫做BRDF&#xff0c;而在实际上&#xff0c;也就是BRDF定义了不同的材质。BRDF决定了光如何被反…

JavaScript经典教程(七)-- JavaScript基础 -- 函数、argument、匿名函数、函数深入、选项卡

188&#xff1a;JavaScript基础 - 函数、argument、匿名函数、函数深入、选项卡 1、函数 &#xff08;1&#xff09;特性 1、每个函数都有自己的作用域。 2、如果执行该变量名&#xff0c;会返回自己&#xff0c;即返回函数本身。 3、正常调用&#xff0c;返回函数中的执…

软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例

软件STM32cubeIDE下STM32F1xx使用定时器&#xff08;TIM8&#xff09;DMAPWM点亮灯带WS2812-基础样例 &#xff08;1&#xff09;前言&#xff08;2&#xff09;环境说明&#xff08;3&#xff09;先行了解本次调到坑里的两个点问题点&#xff08;1&#xff09;TIM3_ch2,在STM3…

真题详解(极限编程)-软件设计(六十一)

真题详解&#xff08;二分查找平均值&#xff09;-软件设计&#xff08;六十)https://blog.csdn.net/ke1ying/article/details/130417464 VLANtag属于 数据链路层实现。 数据链路层&#xff1a;网桥交换机。 网络层&#xff1a;路由器。 物理层&#xff1a;中继器。 Telent…

1694_week1_MIT使用Python编程学习手记1

全部学习汇总&#xff1a; GreyZhang/python_basic: My learning notes about python. (github.com) 首先说明一下&#xff0c;这部分信息的整理只是我个人的理解。由于自己的知识功底以及英语水准&#xff0c;很可能会有大量的疏漏。再此&#xff0c;我只想把自己学习时候的一…

Linux进程通信:信号 信号集 信号集函数

1. 信号的概念 Linux进程间通信的方式之一。信号也称为“软件中断”。 信号特点&#xff1a; 简单&#xff1b;携带信息有限&#xff1b;满足特定条件才发送信号&#xff1b;可进行用户空间和内核空间进程的交互&#xff1b; 信号4要素&#xff1a; &#xff08;1&#xf…

抓马,互联网惊现AI鬼城:上万个AI发帖聊天,互相嗨聊,人类被禁言

近日又有一个社区迷惑走红 上万个AI发帖聊天&#xff0c;人类不得入内&#xff1f; 据红星新闻报道 近日&#xff0c;一个名为Chirper的AI网络社区突然爆火 上万个AI聊天机器人在其中 激烈地聊天、互动、分享 社区主页右上角明确写着&#xff1a; “这是一个人工智能的社交…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版) Chapter 1 Data Mining

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 1 Data Mining Now, statisticians view data mining as the construction of a statistical model, that is, an underlying distribution from which the visible data is drawn. However, ma…

docker上部署程序后无法连接数据库的问题

咱就是说&#xff0c;这个问题差点给我劝退docker。下面说下环境情况。 装了个javaweb程序容器&#xff0c;装了个数据库容器&#xff0c;javaweb容器就是链接不上数据库。 咱也是跟着菜鸟教程的容器互联步骤简历网络链接&#xff1a; 并且启动时增加--networkxxx 都加入到了…

socket通信之select

多线程版本的的socket的server端 #include "socket.hpp" #include <iostream> #include <string> #include <memory>DWORD WINAPI threadProc(LPVOID lp) {SOCKET sClient *(SOCKET*)(lp);while (true) {char buff[1024] { 0 };int result rec…

数据结构初阶 —— 树(堆)

目录 一&#xff0c;堆 堆的概念 向下调整法&#xff08;数组&#xff09; 向上调整法&#xff08;数组&#xff09; 堆的创建&#xff08;建堆&#xff09; 堆的实现 一&#xff0c;堆 堆的概念 如有个关键码的集合K{&#xff0c;&#xff0c;&#xff0c;...&#xf…

Anaconda你不得不知道的若干知识点

Anaconda你不得不知道的若干知识点 1. 查看所有的环境变量2. 加载tensorflow在jupyter中会挂掉怎么办&#xff1f;3. Excel xlsx file&#xff1b; not supported两种解决办法4. (unicode error)5. 统计pandas二维表中的某列的重复值法一&#xff1a;df.loc[:,col_name].value_…

Fabric测试与基础

Fabric官网:Introduction — hyperledger-fabricdocs main documentation 1.测试网络 ./network.sh up #启动./network.sh down #关闭 2.Fabric核心模块 peer:主节点模块&#xff0c;负责存储区块链数据&#xff0c;运行维护链码 orderer:交易打包、排序模块 cryptogen:组织…

【机器学习分支】重要性采样(Importance sampling)学习笔记

重要性采样&#xff08;importance sampling&#xff09;是一种用于估计概率密度函数期望值的常用蒙特卡罗积分方法。其基本思想是利用一个已知的概率密度函数来生成样本&#xff0c;从而近似计算另一个概率密度函数的期望值。 想从复杂概率分布中采样的一个主要原因是能够使用…

uniapp 抖音授权登录、发布、分享 Ba-Aweme

简介&#xff08;下载地址&#xff09; Ba-Aweme 是一个集成抖音的uniapp插件&#xff0c;支持抖音授权登录&#xff0c;发布图片、视频&#xff0c;分享到联系人群组&#xff0c;直接拍摄等。自带选择图片和选择视频方法。 注意&#xff1a; 使用前&#xff0c;先到抖音开放…

LabVIEW CompactRIO 开发指南 3 选择CompactRIO编程模式

第二章 选择CompactRIO编程模式 第一章中介绍的CompactRIO架构为我们提供了通过LabVIEW FPGA定制FPGA硬件或使用NI CompactRIO扫描模式来实现I/O的选项。如果计算机上有LabVIEW Real-Time和LabVIEW FPGA&#xff0c;那么当向LabVIEW项目添加CompactRIO目标时&#xff0c;将提…

BM48-数据流中的中位数

题目 如何得到一个数据流中的中位数&#xff1f;如果从数据流中读出奇数个数值&#xff0c;那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值&#xff0c;那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流&…