使用循环单链表来解决约瑟夫问题

运用循环单链表实现约瑟夫问题 阅读详情

刚学数据结构做的一个模拟

标题
约瑟夫环
时间限制
2 S
内存限制
10000 Kb
问题描述
习题集P79。编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。现在给定一个随机数m>0,从编号为1的人开始,按顺时针方向1开始顺序报数,报到m时停止。报m的人出圈,同时留下他的密码作为新的m值,从他在顺时针方向上的下一个人开始,重新从1开始报数,如此下去,直至所有的人全部出圈为止。
问题输入
输入数据第一行为两个正整数n和m,分别表示人的个数及初始随机数,每组数据的第二行为n个整数,表示每个人持有的密码。
问题输出
用一行输出n个整数表示依次出圈人的编号,整数之间用空格分隔
输入样例
7 20
3 1 7 2 4 8 4

输出样例
6 1 4 7 2 3 5

大体思路就是用循环单链表来模拟,这样能保证删除一个节点的时候,仍然能够保持循环单列表的一个结构。这道题体现了尾指针的重要性…目前我删除一个节点通常是要知道前一个节点的指针。

.

// An highlighted block
#include<stdio.h>
#include<stdlib.h>
typedef struct Lnode{
	Lnode *next;
	int ID;
	int code;
}Lnode,*LinkList;

void creat_list(int n,int m,LinkList &a,LinkList &r){
	Lnode *p=a,*q;
	p->ID=1;
	int num;
	scanf("%d",&num);
	p->code=num ;
	for(int i=2;i<=n;i++){
		scanf("%d",&num);
		q=(Lnode*)malloc(sizeof(Lnode));
		q->ID=i;
		q->code=num; 
		p->next=q;
		p=p->next;
		if(i==n){
			q->next=a;
			r=q;
		}
	}
}

void out(LinkList &a,int &m,LinkList &r){
	Lnode *q=a,*p=r;
	if(a->next!=a){
	for(int i=1;i<m;i++){
		p=p->next;
		q=q->next;
		r=r->next;
	}
	
	printf("%d ",q->ID);
	m=q->code;
	p->next=q->next;
	free(q); 
	 
	out(p->next,m,r);
}
	else printf("%d ",a->ID);
}

int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	LinkList a,r;
	a=(LinkList)malloc(sizeof(Lnode));
	r=(LinkList)malloc(sizeof(Lnode));
	creat_list(n,m,a,r);
	out(a,m,r);
	return 0;
} 
c语言循环单链表实现约瑟夫环问题 阅读详情

相关推荐

约瑟夫问题用不含头结点的循环单链表解决

问题描述: 设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m的人出列,然后从出列的下一个人重新开始报数,数到第m的人又出列,…,如此反复直到所有的人全部出列为止。Josephus问题是:对于任意给定的n,s和m,求出按出列次序得到的n个人员的序列。 现以n=8,s=1,m=4为例,问题的求解过程如图2-15所示。图中s1指向开始报数位置,若初始的顺序为n1,n2,n3,n4,n5,n6,n7,n8。则问题的解为n4,n8,n5,n2,n1,n3,n7,n6。...

yuki_1209的博客 1141

循环单链表解决约瑟夫问题

1.约瑟夫问题 1.1 基本目的 使用循环单链表实现有密码的约瑟夫问题,即每次出局的人会更改计数上限,每个人身上都会附带一个密码。输入每个人的信息,输出出局的顺序。 1.2 核心代码 1.2.1 实现方法 public void test(int pass,Node node){ if(length==0) return; for(int ...

qq_16215221的博客 1030

C语言利用循环单链表解决约瑟夫问题

Description  编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他的顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。请设计一个程序输出出列顺序。 提示:存储结构采用不带头结点的循环单链表,...

Xenoverse的博客 1636

数据结构之单链循环(约瑟夫环)

约瑟夫环:用循环链表编程实现约瑟夫问题。

YSTXDY的博客 857

C++利用循环单链表解决约瑟夫环问题

有n个元素,编号从1号开始一直到n号,形成一个环,从第k号开始报数,报到m的出列,直到所有元素都出列为止。

henry594xiaoli的博客 7028

单链表解决约瑟夫环问题

使用单链表解决约瑟夫环问题,输入链表元素个数及开始的位置和数的步长,依次输出被数到的数字,然后输出最后数到的数字。

循环单链表解决约瑟夫环问题

约瑟夫环问题的解决: ##数据结构课的作业,使用了循环单链表来解决这个问题,不过在原题的基础上作了一点点变化,下面上代码! 首先放上解决问题的代码! import java.util.Scanner; public class Y { /** * @param args */ public static void main(String[] args) { // TODO Aut...

eexiaobai的博客 1426

当R语言遇见MaxENT:参数优化的艺术与自动化调参实践

本文探讨了R语言与MaxENT在生态位建模中的结合应用,重点介绍了参数优化与自动化调参的实践方法。通过caret与ENMeval工具链,研究人员可以高效处理多物种、多环境变量的大规模分析任务,提升模型性能与工作效率。文章还涵盖了从数据准备到结果可视化的全流程,为生态学家提供了实用的技术指导。

corn8的博客 455

用循环单链表解决约瑟夫问题

http://www.oschina.net/code/snippet_188162_9893

jxkongyue的专栏 1649

Argoverse2数据集保姆级导入教程:从下载到预处理全流程解析

本文详细解析了Argoverse2数据集的完整导入流程,从环境配置、数据下载到预处理和高效加载策略。作为自动驾驶领域的标杆数据集,Argoverse2提供多模态传感器数据和高精地图信息,帮助研究者快速搭建数据处理流水线。文章包含实用代码示例和性能优化技巧,特别适合自动驾驶算法开发者参考。

weixin_29035405的博客 336

Spring Boot日志可视化实战:5分钟搞定Promtail采集与Grafana查询(避坑指南)

本文详细介绍了如何通过Promtail和Grafana实现Spring Boot日志的可视化查询,提供从日志采集到高效查询的全流程实战指南,重点解决部署中的常见问题。内容包括Logback配置、Promtail日志采集、Grafana的LogQL查询技巧及生产环境优化建议,帮助开发者快速定位和解决日志问题。

weixin_42526015的博客 106

用循环单链表解决约瑟夫(Joseph)问题

@用循环单链表解决约瑟夫(Joseph)问题 用循环单链表解决约瑟夫(Joseph)问题 问题描述 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所...

bwqiang的博客 1278

Metal 一、初识 Metal 及其语言规范

游戏开发者的新的技术平台,该技术能够为3D图像提高 10 倍的渲染性能。苹果2018年推出 Metal,在此之前一直使用OpenGL ES。1图形渲染;2高并发计算。苹果文档给出的 Metal 优化:CPU 低消耗、GPU 高利用、连续处理器并行、有效的资源利用Metal 官方文档。

irainsa的博客 1219

循环单链表的实现,解决约瑟夫丢手帕问题

<!DOCTYPE unspecified PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head><title>php--循环单链表的实现,解决约瑟夫丢手帕问题</title></head> <body> <?php class Child{ public $no;

Cb_MX 542

别再折腾老教程了!树莓派4B/5最新系统(Raspberry Pi OS Bookworm)红外遥控配置,用gpio-ir驱动一次成功

本文详细介绍了树莓派4B/5在最新Raspberry Pi OS Bookworm系统下配置红外遥控的完整指南,摒弃过时的lirc-rpi驱动,采用现代gpio-ir驱动方案。从硬件连接到软件配置,提供10分钟快速上手指南,涵盖驱动加载、信号测试、按键映射及高级应用场景,帮助用户高效完成红外遥控配置。

weixin_42520909的博客 442

华为OD机考双机位C卷 - 相对开音节 (Java & Python & JS & GO & C++ & C)

华为OD机考双机位C卷 - 相对开音节 , 提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 743

如何用循环单链表解决约瑟夫问题?

约瑟夫问题: 人们站在一个等待被处决的圈子里。 计数从圆圈中的指定点开始,并沿指定方向围绕圆圈进行。 在跳过指定数量的人之后,执行下一个人。 对剩下的人重复该过程,从下一个人开始,朝同一方向跳过相同数量的人,直到只剩下一个人,并被释放。 问题即,给定人数、起点、方向和要跳过的数字,选择初始圆圈中的位置以避免被处决。 历史: Josephus有过的故事:39 个犹太人与Josephus及他的...

LiuQQu的专栏 783

大模型系列——Ollama简明教程

在这篇文章中,我们将了解如何使用 Ollama、如何在 Ollama 中创建自己的模型 以及如何使用 Ollama 构建聊天机器人。这是深入研究 Ollama 的第一部分,以及我所学到的有关本地 LLM 的知识以及如何将它们用于基于推理的应用程序。在这篇文章中,你将了解——

2401_84052244的博客 1万+

循环单链表,解决约瑟夫问题

约瑟夫问题: 编号为1~N的N个人按顺时针方向围坐一圈,每人持有一个密码(正整数),开始任选一个正整数作为报数上限值M,从第1个人按顺时针方向自1开始顺序报数,报到M时停止报数。报M的人出列,将他的密码作为新的M值,从他顺时针方向上的下一个人开始从1报数,如此下去,直至所有人全部出列为止。 解析: 显然当有人退出圆圈后,报数的工作要从下一个人开始继续,而剩下的人仍然围成一个圆圈,因此可以使用...

weixin_34167043的博客 203

[DDR5]DDR5 SDRAM 状态图 和 基本功能

DDR5 SDRAM的读写操作以突发(burst mode)为导向,从选定的位置开始,并按照编程顺序进行16个突发长度或8个“切片”突发长度的操作。从ACTIVATE命令开始,然后是读取或写入命令。

串起点滴 1200

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

使用循环单链表解决约瑟夫问题

Josephu问题为:设编号为1,2,...n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。 这里用一个不带头结点的循环链表来处理Josephu问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。 以1,2,3,4,

sinat_31089473的博客 1582

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

3.10 约瑟夫环问题--循环单链表解决

/*************************************************************** *约瑟夫环问题 *问题描述:N个人做成一圈,从第K个人开始报数游戏(从0开始报数), 报M的出列,最后剩下的一个人获胜 *算法: 循环单链表(无头节点) *新建单链表: 返回value最小的节点当作"head",新建过程即是插入过程 *删除(出列操

putaoxiangqi的专栏 517

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: POJ3984 迷宫问题
下一篇: 无相连通子图
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值