【算法竞赛】实现约瑟夫问题的四种方法(附手绘图详解)

news2025/1/2 4:32:42

  • 💌 博客内容:实现约瑟夫问题的四种方法

  • 😀 作  者:陈大大陈

  • 🚀 个人简介:一个正在努力学技术的准前端,专注基础和实战分享 ,欢迎私信!

  • 💖 欢迎大家:这里是CSDN,我总结知识和写笔记的地方,喜欢的话请三连,有问题请私信 😘 😘 😘

 

目录

1.动态单向链表实现的方法 

 2.用结构体数组实现单向静态链表实现的方法

3.用结构体数组实现双向静态链表实现的方法 

4.一维数组实现单向循环链表

题目描述
n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。

输入格式
输入两个整数 n,m。

输出格式
输出一行 n 个整数,按顺序输出每个出圈人的编号。

输入输出样例
输入

10 3


输出

3 6 9 2 7 1 8 5 10 4


说明/提示
1≤m,n≤100

1.动态单向链表实现的方法 

动态链表需要临时分配链表节点,使用完毕后需要释放链表节点,动态链表的优点是能及时释放空间,不用使用多余的内存,缺点是需要管理空间,比较容易出错

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
struct node
{
	int data;
	node* next;//单向链表,一个next指针
};
int main()
{
	int m, n;
	scanf("%d%d", &n, &m);
	node* head, * p, * now, * prev;
	head = new node; head->data = 1; head->next = NULL;//分配第一个节点,数据置为1
	now = head;
	for (int i = 2; i <= n; i++)
	{
		p = new node; p->data = i; p->next = NULL;//把申请的新节点链接到前面的链表上
		now->next = p;
		now = p;
	}
	now->next = head;
	//上面是建立链表。
	now = head, prev = head;
	while ((n--) > 1)
	{
		for (int i = 1; i < m; i++)//数到m为止
		{
			prev = now;//类似于单链表的元素删除,记录前一个位置,用于下面跳过第m个节点
			now = now->next;
		}
		printf(" %d ", now->data);
		prev->next = now->next;
		delete now;
		now = prev->next;
	}
	printf(" %d", now->data);//最后一个节点的打印
	delete now;//释放掉最后一个节点
	return 0;
}

为了方便大家理解思路,我做出了第一次while循环的图示 ,为了简便,节点就设置成了4个,m的值就设置为3。

 2.用结构体数组实现单向静态链表实现的方法

静态链表较动态链表省去了动态分配和释放储存空间的麻烦。可以加快编码的速度。 

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
const int N = 100;//定义静态链表的空间大小
struct node
{
	int id, nextid;
}nodes[N];
int main()
{
	int n, m;
	scanf("%d%d", &n, &m);
	nodes[0].nextid = 1;
	for (int i = 1; i <= n; i++)
	{
		nodes[i].id = i, nodes[i].nextid = i + 1;
	}
	nodes[n].nextid = 1;
	int now = 1, prev = 1;
	while ((n--) > 1)
	{
		for (int i = 1; i < m; i++)
		{
			prev = now;
			now = nodes[now].nextid;
		}
		printf(" %d ", nodes[now].id);
		now = nodes[prev].nextid;
	}
	printf(" %d", nodes[now].nextid);
	return 0;
}

同样是画了个简图方便理解(不要嫌弃我字丑🤗🤗🤗) 

3.用结构体数组实现双向静态链表实现的方法 

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
const int N = 100;
struct node
{
	int id;
	int preid, nextid;//前后节点
}nodes[N];
int main()
{
	int n, m;
	scanf("%d%d", &n, &m);
	nodes[0].nextid = 1;
	for (int i = 1; i <= n; i++)
	{
		nodes[i].id = i;
		nodes[i].preid = i - 1;
		nodes[i].nextid = i + 1;
	}
	nodes[n].nextid = 1;//循环链表,尾指向头
	nodes[1].preid = n;//循环链表,头指向尾
	int now = 1;//从第一个节点开始
	while ((n--) > 1)
	{
		for (int i = 1; i < m; i++)
		{
			now = nodes[now].nextid;
		}
		printf(" %d ", nodes[now].id);
		int prev = nodes[now].preid, next = nodes[now].nextid;
		nodes[prev].nextid = nodes[now].nextid;
		nodes[next].preid = nodes[now].preid;
		now = next;//新的开始
	}
	printf(" %d", nodes[now].nextid);
	return 0;
}

同样的,简图方便大家理解。 

4.一维数组实现单向循环链表

这是最简单的实现方法。定义一个一维数组,数组的第i个节点的i就是节点的值。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
int nodes[150];
int main()
{
	int n, m;
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n - 1; i++)
	{
		nodes[i] = i + 1;//nodes[i]的值就是下一个节点
	}
	nodes[n] = 1;
	int now = 1, prev = 1;
	while ((n--) > 1)
	{
		for (int i = 1; i < m; i++)
		{
			prev = now; now = nodes[now];
		}
		printf(" %d ", now);
		nodes[prev] = nodes[now];//跳过now节点
		now = nodes[prev];//新的now节点
	}
	printf(" %d", now);
	return 0;
}

这个就不画图了。

现在我是在自学c++,还不是很熟练。 

总结
  感谢观看,本文到这里就结束了,如果觉得有帮助,请给文章点个赞吧,让更多的人看到。🌹 🌹 🌹

7673ea0a00c3431893891e0c2913a10e.jpeg  

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

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

相关文章

视频剪辑配乐技巧 视频剪辑配音推荐

视频是视觉加听觉的艺术&#xff0c;视频的背景音乐不同&#xff0c;所呈现的效果也不同。接下来为大家带来大家视频剪辑配乐技巧&#xff0c;视频剪辑配音推荐的相关内容。 一、视频剪辑配乐技巧 视频剪辑时选好了配乐&#xff0c;视频就成功了一半。那如何找到合适的配乐呢…

yapi一键安装 文档开源系统

访问 GitHub - Ryan-Miao/docker-yapi: Docker build and run yapi as serviceDocker build and run yapi as service. Contribute to Ryan-Miao/docker-yapi development by creating an account on GitHub.https://github.com/Ryan-Miao/docker-yapi git clone https://githu…

Class类

package com.hspedu.reflection.class_;import com.hspedu.Cat;import java.util.ArrayList;/*** author 韩顺平* version 1.0* 对Class类特点的梳理*/ public class Class01 {public static void main(String[] args) throws ClassNotFoundException {//看看Class类图//1. Cla…

python版电报API接入从零到一(有彩蛋)

文章链接 编号分类文章及链接介绍作者来源分类撰写日期收录日期F1框架python版telegram接入开源botpython-telegram-botGithub2023-04-24 申明&#xff1a;本文仅作试验研究用&#xff0c;不对参考本文操作产生的各种结果承担任何责任。 Q&A 使用Telegram的API需要交费吗…

三顾茅庐,七面阿里,成功上岸25k16薪,我行你也行~

写在片头&#xff1a;声明&#xff0c;勿杠 首先简单说一下&#xff0c;这三次面试阿里并不是一次性去面的&#xff0c;实际上第一次面试时候还在大四&#xff0c;找的实习岗&#xff0c;不太清楚是什么部门&#xff0c;别问我为什么还记得面试题&#xff0c;有记录和复盘的习惯…

什么是OADM光分插复用器

文章导读&#xff1a; 什么是OADM光分插复用器 光分插复用器的功能 光分插复用器的类型&#xff08;FOADM, TOADM&#xff09; OADM的应用 1、什么是OADM光分插复用器 由不同的光通道进出单模光纤。 它的主要功能是在不影响其他波长信道传输的情况下&#xff0c;选择性地下载或…

Vue(监测数据改变、收集表单数据、过滤器)

一、监测数据改变原理 1. 监测对象数据改变原理 当数据发生改变之后&#xff1a;直接会显示数据改变&#xff08;一种强硬写法&#xff09; let data { name: "北京大学", address: "北京" };// 以下通过temp进行监视&#xff1a;还得还原temp值&#xf…

k8s 部署 ldap 服务

1、创建挂载卷&#xff0c;将数据和配置进行持久化存储 1.1、使用nfs作为共享存储 [rootlocalhost openldap_yaml]# cat /etc/exports /dump_file/openldap_db 172.21.53.0/24(rw,sync,no_root_squash,no_all_squash) /dump_file/openldap_conf 172.21.53.0/24(rw,sync,no_roo…

【Linux常见指令以及权限理解】基本指令(1)

写在前面&#xff1a; 相信看完上一个博客&#xff0c;我们已经成功搭建好了Linux环境&#xff0c; 如果没有可以去看看&#xff1a;Linux环境搭建。 接下来我会讲述Linux的常见指令以及权限理解相关内容。 这篇文章会介绍一些常用的Linux指令并穿插一些操作系统的概念理解…

巧用千寻位置GNSS软件|一文教会横断面测量

测横断面主要用于线路工程和水利工程的前期设计中&#xff0c;在线路平曲线设计好之后&#xff0c;千寻位置GNSS软件可用于在中桩处测定垂直于线路中线方向原地貌的地面起伏的数据&#xff0c;本期就为大家介绍具体的操作技巧。 点击【测量】->【测横断面】&#xff0c;选择…

ByteHouse云数仓版查询性能优化和MySQL生态完善

ByteHouse云数仓版是字节跳动数据平台团队在复用开源 ClickHouse runtime 的基础上&#xff0c;基于云原生架构重构设计&#xff0c;并新增和优化了大量功能。在字节内部&#xff0c;ByteHouse被广泛用于各类实时分析领域&#xff0c;最大的一个集群规模大于2400节点&#xff0…

( 栈和队列) 20. 有效的括号 ——【Leetcode每日一题】

❓20. 有效的括号 难度&#xff1a;简单 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;]的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合…

决策树入门、sklearn实现、原理解读和算法分析

文章目录 决策树入门决策树sklean实现决策树算法单/多变量决策树CART分类树算法 决策树分析复杂度控制特征重要性决策树特点 决策树入门 总算来到心心念念的决策树了。工作中一直在用xgb模型&#xff0c;今天开始&#xff0c;终于可以尝试去理解其背后的算法原理了。不过xgb较…

软件开发全套文档案例分享

写在前面 在日常项目开发过程中&#xff0c;会产生大量的过程文档&#xff0c;比如开发过程中的文档、管理过程中的文档、产品相关文档等等&#xff0c;那这些文档我们日常怎么去管理呢&#xff1f;怎么去做规划呢&#xff1f;如何做成通用标准呢&#xff1f;小编特地整理了一…

问卷中多选题如何分析?

一、案例与问卷 本研究选取大学生作为研究对象&#xff0c;旨在通过理财认知、理财现状、理财偏好三个方面&#xff0c;对大学生理财产品了解情况、使用需求进行调查。本次问卷共分为四个部分&#xff1a;第一部分共5道题&#xff0c;为基本信息题&#xff1b;第二部分共3道题…

换肤实现及LayoutInflater原理

文章目录 背景实现换肤步骤解析插件 apk 的包信息获取插件 apk 的 Resources 对象替换资源 简单的插件化换肤实现和存在的问题换肤如何动态刷新&#xff1f;控件换肤刷新的性能考虑如何降低 xml 布局中 View 的替换成本LayoutInflater 原理LayoutInflater.Factory2 替换 View 小…

antDesignPro6: 如何设置环境变量,取值自动根据不同环境,动态修改(3步)。

官网文档&#xff1a;环境变量 - Ant Design Pro Pro 脚手架默认使用 Umi 作为底层框架&#xff0c;在 Umi 内可通过指定 UMI_ENV 环境变量来区分不同环境的配置文件&#xff0c;UMI_ENV 需要在 package.json 内配置。当 UMI_ENV 为 test 时&#xff0c;则必须在 config 目录下…

二十、线索关联市场活动(二):关联

功能需求 用户在线索明细页面,点击"关联市场活动"按钮,弹出线索关联市场活动的模态窗口; 用户在线索关联市场活动的模态窗口,输入搜索条件,每次键盘弹起,根据名称模糊查询市场活动,把所有符合条件的市场活动显示到列表中; 用户选择要关联的市场活动,点击"关联…

电销CRM客户关系管理系统开发12大核心功能

电销CRM管理系统软件是一款专门针对电销行业开发的客户关系管理软件&#xff0c;它能够帮助企业实现对顾客信息的可视化&#xff0c;智能化&#xff0c;自动化管理&#xff0c;提高电销效率和客户满意度。电销行业在传统互联网营销&#xff0c;新媒体营销&#xff0c;短视频营销…

PINNs与DeepXDE:加速物理计算模型

《AIScience系列&#xff08;一&#xff09;&#xff1a;飞桨加速CFD&#xff08;计算流体力学&#xff09;原理与实践》 https://baijiahao.baidu.com/s?id1728002499252273827&wfrspider&forpc 前言 AIScience专栏由百度飞桨科学计算团队出品&#xff0c;给大家带来…