数据结构代码集训day16(适合考研、自学、期末和专升本)

news2024/12/25 23:36:33

本题来自B站up:白话拆解数据结构


今日题目就一个:约瑟夫环问题。

        一个圈共有N个人(N为不确定的数字),第一个人的编号为0或者1(两个都可以,看你的程序如何编写),假设这边我将第一个人的编号设置为1号,那么第二个人的编号就为2号,第三个人的编号就为3号,第N个人的编号就为N号,现在提供一个数字M,第一个人开始从1报数,第二个人报的数就是2,依次类推,报到M这个数字的人出局,紧接着从出局的这个人的下一个人重新开始从1报数,和上面过程类似,报到M的人出局,直到N个人全部出局,请问,这个出局的顺序是什么?

        这张图内圈代表元素,外圈代表出局的顺序。这里的元素有10个,报到三出局。出局就相当于从这个圈出去了,圈内元素减1。


        这题有三种方法,第一个方法是用顺序表,用i记录出列下标,用count记录出列的个数,由于走完一圈后需要回到开头继续数,所以要i=i%L.length重置一下,删除的操作就是元素前移,前面已经说过了。

    void fa1(SqList &L,int N,int M){    

        int count=0,i=0;  

        while(count!=N){

            for(int k=0;k<M-1;k++,i++);

            if(i>=L.length)      i=i%L.length;

            printf("%d ",L.data[i]);

            for(int j = i; j < L.length - 1; j++) {

            L.data[j] = L.data[j + 1];

        }

            count++;

            L.length--;     

        }

    }

实践:打印依次出队的元素

        法二:用循环单链表,刚好类似于图上的结构,和上面一样,找M,然后删除,就是重置的时候注意一下就行了。

    void fa2(Linklist &L,int N,int M){

        if (L == NULL || L->next == L)

            return; // 空链表或链表只有一个节点时,无需删除

        Lnode *pre ,*p;        // 删除的两个指针

        pre=L;

        p=L->next;

        while(L!=L->next){

            for(int i=0;i<M-1;i++){

                pre=p;

                p=p->next;

                if(p==L){        // 重置

                p=p->next;

                pre=pre->next;

                }

            }

            printf("%d ",p->data);

           

            pre->next=p->next;

            free(p);

            p=pre->next;

            }

    }

实践:

 

        法三:递归的做法,当 i == 1 时,表示只剩下一个人。这时,这个人的位置通过公式 (M - 1 + N) % N 来计算;函数通过调用自身,递归地减少人数(N-1)和索引(i-1),逐步缩小问题的规模;递归调用的结果会通过加上步长 M 并取模 N 来调整,确保计算的位置在当前圆圈中有效。

  int fa3(int N,int M,int i){

        if(i==1)    return (M-1+N)%N;

        else return (fa3(N-1,M,i-1)+M)%N;

    }

 实践:这里输出的是位序,换算出来和上面一样。

#include <iostream>
#include <cstdio>
#include <stack>
#include <ctime>
using namespace std;

typedef int ElemType;

struct SqList {
    ElemType data[100];
    int length;
};

typedef struct Lnode{
    int data;
    Lnode *next;
}Lnode,*Linklist;

Linklist list_insertbytail(Linklist &L) {
    Lnode *s;
    int x;
    
    // 初始化头节点(哨兵节点),不存储实际数据
    L = (Lnode*)malloc(sizeof(Lnode));
    L->next = L;  // 初始化为循环结构
    Lnode *r = L; // r始终指向链表的尾节点
    
    cin >> x;
    while (x != 9999) {
        s = (Lnode*)malloc(sizeof(Lnode));  // 为新节点分配空间
        s->data = x;                        // 将数据存入新节点
        s->next = L;                        // 新节点的next指向头节点,形成环

        r->next = s;                        // 将新节点链接到尾部
        r = s;                              // 更新尾节点指针为r
        
        cin >> x;                           // 继续输入下一个数据
    }

    return L;  // 返回循环链表
}

// 约瑟夫环问题,N个人报数,报到M的出列,从M的下一个开始报,报到M的再次出列,问剩下的那个是谁
class Solution{
public: 
    void fa1(SqList &L,int N,int M){    // 找M,删M,从下一个开始
        int count=0,i=0;  // count统计出列个数,到N-1就行了
        while(count!=N){
            for(int k=0;k<M-1;k++,i++);
            if(i>=L.length)      i=i%L.length;
            printf("%d ",L.data[i]);
            for(int j = i; j < L.length - 1; j++) {
            L.data[j] = L.data[j + 1];
        }
            count++;
            L.length--;
            
        }

    }

    void fa2(Linklist &L,int N,int M){
        if (L == NULL || L->next == L) 
            return; // 空链表或链表只有一个节点时,无需删除
        Lnode *pre ,*p;
        pre=L;
        p=L->next;
        while(L!=L->next){
            for(int i=0;i<M-1;i++){
                pre=p;
                p=p->next;
                if(p==L){
                p=p->next;
                pre=pre->next;
                }
            }
            printf("%d ",p->data);
            
            pre->next=p->next;
            free(p);
            p=pre->next;
            }

    }

    int fa3(int N,int M,int i){
        if(i==1)    return (M-1+N)%N;
        else return (fa3(N-1,M,i-1)+M)%N;
    }

};

int main(){
    // SqList L;
    // L.length =10;
    // // srand(static_cast<unsigned int>(time(nullptr)));
    // // // 随机赋值
    // for(int i =0;i<L.length;i++){
    //     L.data[i] = i+1;   
    // }
    // Linklist L;
    // list_insertbytail(L);
    // Lnode *p = L->next;
    int N,M;
    cin>>N>>M;
    printf("start:");
    Solution a;
    // a.fa1(L,10,3);
    for(int i=1;i<=N;i++)
        printf("%d ",a.fa3(N,M,i));
    return 0;
}

 

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

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

相关文章

提升App推广效果,从精准获取下载数据开始

在App推广的过程中&#xff0c;获取准确的下载数据一直是一个令人头疼的问题。你知道吗&#xff1f;无法精确追踪用户来源和下载量&#xff0c;就像是在黑暗中摸索&#xff0c;让推广效果大打折扣。今天&#xff0c;我们就来揭秘如何轻松获取App下载数据&#xff0c;优化你的推…

解题--有关动态内存开辟 几道经典的笔试题

文章目录 前言 一、题目一 二、题目二 三、题目三 四、题目四 总结 前言 路漫漫其修远兮&#xff0c;吾将上下而求索。 一、题目一 运行Test 函数会出现什么样的结果&#xff1f; 在Test函数之中&#xff0c;首先创建了一个指针变量 str , 并将其赋值为NULL&#xff1b; …

查看HBA卡是否支持FC协议

cat /sys/class/fc_host/host*/port_name lspci | grep -i fibre # 看有无fibre channel控制器 官网查询 Emulex Lpe32000 https://docs.broadcom.com/doc/12357773 https://cn.genuinemodules.com/image/catalog/pdf/18/LPe32000.pdf

Python【2】问题

目录 模块与包是什么&#xff1f; 赋值、浅拷贝和深拷贝的区别&#xff1f; Python中如何生成随机数&#xff1f; Python中的os模块常用方法&#xff1f;□ os.path和sys.path分别表示什么意思&#xff1f;□ 赋值 read、readline和readlines的区别&#xff1f; 介绍一…

vTESTstudio系列13--vTESTstudio中的动态函数库介绍3

在上一篇文章中&#xff08;vTESTstudio系列12--vTESTstudio中的动态函数库介绍2&#xff09;&#xff0c;给大家介绍了如何通过osek_tp.dll的接口去发送诊断指令&#xff0c;本篇文章给大家介绍如何去处理诊断回复内容&#xff0c;确保实际的诊断回复是符合需求。Lets Go!!! …

Java项目: 基于SpringBoot+mysql在线文档管理系统(含源码+数据库+开题报告+答辩PPT+毕业论文)

一、项目简介 本项目是一套基于SpringBootmysql在线文档管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功…

VScode:前端开发中的常用快捷键和技巧

1.菜单栏 2.内容相关&#xff1a; 格式化文档 搜索文件名

海外盲盒APP系统开发,盲盒全球化发展机遇

盲盒全球化 近几年&#xff0c;盲盒在海外市场中迎来了爆发式增长&#xff0c;成为了一种新的潮流&#xff0c;拥有极高的人气&#xff0c;盲盒出海也已经成为了一个大风口&#xff0c;为我国盲盒市场带来了商业机遇&#xff01;在盲盒出海的热潮下&#xff0c;海外盲盒APP系统…

相亲交友系统开发中的关键要素

相亲交友系统开发旨在构建一个在线平台&#xff0c;专为单身人士设计&#xff0c;以促进他们寻找合适的伴侣或朋友。以下是该系统开发的关键要素&#xff1a; 用户账户管理&#xff1a;允许用户创建账户&#xff0c;进行注册和登录&#xff0c;以便他们能够建立个人资料并参与…

01:【铁头山羊stm32-HAL库】对GPIO的操作

对GPIO的操作 1、LED闪烁2、按键控制LED3、芯片调试接口被锁死导致无法下载程序 1、LED闪烁 使用的是STM32CubeMXKeilv5进行HAL库的开发。 开发的步骤&#xff1a; 第一步&#xff1a;新建工程 第二步&#xff1a;选择芯片 第三步&#xff1a;如下图哈哈 第四步&#xff1a;…

图像去噪实验:基于全变分(TV)模型的MATLAB实现

一、背景 全变分模型在图像处理领域中被广泛用于去除噪声&#xff0c;同时保持图像边缘的清晰度。 二、实验步骤 图像的读取、噪声添加、去噪处理以及结果的显示。 三、实验仿真结果图 四、结论 全变分模型是一种有效的图像去噪方法&#xff0c;它能够在去除噪声的同时&#…

shell脚本的变量与应用

Shell脚本是一种解释性语言&#xff0c;用于编写自动化任务和系统管理脚本。在Shell脚本中&#xff0c;变量用于存储和操作数据。变量在脚本中可以被赋值、读取和修改。 在shell脚本中&#xff0c;变量用于存储数据&#xff0c;可以是数字、字符串或其他类型的值。可以使用…

基于yolov8的道路病害道路裂缝道路坑洞检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的道路病害检测系统&#xff0c;特别是针对道路裂缝和坑洞的检测&#xff0c;是一种高效、准确的智能解决方案。该系统利用YOLOv8这一先进的深度学习算法&#xff0c;通过深度神经网络对图像进行特征提取和分类&#xff0c;实现对道路病害的实时检测和…

期权会不会爆仓?如果期权亏了,会亏到倒欠吗?!

今天带你了解期权会不会爆仓&#xff1f;如果期权亏了&#xff0c;会亏到倒欠吗&#xff1f;&#xff01;期权作为一种金融衍生工具&#xff0c;已经被广大的投资者所接受&#xff0c;并广泛地应用于风险管理等诸多领域。 期权会爆仓吗&#xff1f; 对于期权而言&#xff0c;…

杭州网站建设网页手机版

杭州作为中国的电子商务之都&#xff0c;网站建设在杭州可谓是异常繁荣。随着移动互联网的兴起&#xff0c;越来越多的企业开始注重网页的手机版建设&#xff0c;以满足用户在移动设备上的浏览需求。杭州网站建设公司也专门针对手机版网页进行优化&#xff0c;提供更好的用户体…

AUTOSAR Adaptive与智能汽车E/E架构发展趋势

AUTOSAR Adaptive是一个面向现代汽车应用需求的标准&#xff0c;特别适用于那些需要高计算能力和灵活性的应用。以下是AUTOSAR Adaptive的典型特性&#xff1a; 高计算能力&#xff1a;AUTOSAR Adaptive支持使用MPU&#xff08;微处理器&#xff09;&#xff0c;这些处理器的性…

2024上半年上海产业转移分析报告

近日&#xff0c;由工业和信息化部举办的2024中国产业转移发展对接活动成功举办。作为全国唯一一个聚焦产业转移的“国字号”盛会&#xff0c;中国产业转移发展对接活动旨在通过跨区域的产业合作与对接&#xff0c;推动产业有序转移和区域协调发展&#xff0c;目前已于四川、贵…

无人机螺旋桨常见材料!!!

一、常见材料及其特点 复合材料&#xff08;如玻璃纤维、碳纤维&#xff09; 特点&#xff1a;轻量化、坚韧、高效。这些复合材料由玻璃纤维、碳纤维等在树脂基体中制成&#xff0c;可以显著提高无人机的飞行效率和稳定性。碳纤维复合材料尤其具有重量轻、抗张强度高、耐腐蚀…

Leetcode面试经典150题-83.删除链表中的重复元素

解法都在代码里&#xff0c;不懂就留言或者私信 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val …

Linux-目录结构和Vim编辑器

目录 Linux目录结构 基本介绍 ​编辑 具体的目录结构 Vim编辑器 vi和vim的基本介绍 vi和vim常用的三种模式 正常模式 插入模式 命令行模式 各种模式的相互切换 vim快捷键盘图 粘贴与删除 拷贝当前行并粘贴 拷贝多行并粘贴 删除当前行 删除多行 Vim的退出保存…