约瑟夫环---自杀环问题 简单明了的循环链表版
这是一道经典的链表题
约瑟夫环–自杀环问题
约瑟夫环问题有着这样的历史:
Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓。于是决定了自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀。然后下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
大致意思
一共有N个人围坐在一起, 循环周期是M, 第一个人报数1, 第二个人报数2, 当报数到M时, 这个人就会出列。 下一个人继续从1开始报数, 整个过程持续到所有人出列为止。 这种问题一般会问最后一个出列的人是谁, 或者问你某个人是第几个出列的。。。
对于学习了计算机的我们来说,重复性如此强的过程,当然要交给计算机来帮我们完成呐。所以我们一起来编写这个程序吧。
之前更了数组实现和数学推理方法,现在来补链表法。
大致思路
建立一个单向循环链表(看题目而定),先建立一个表头,在把每个人一个一个的尾插进去,然后把头尾相连。在模拟报数,把要自杀的人一个一个删掉,最后留下来的那个,就是答案。
#include<stdio.h>
#include<stdlib.h>
typedef struct node{int data;struct node *next;
} node;node* creat(int data)
{node *head;head = (node *)malloc(sizeof(node));head->data = data;head->next = NULL;return head;} //建立链表
node* creatnode(node* head, int data)
{node *now = head;node *neww = (node*)malloc(sizeof(node));neww->data = data;neww->next = NULL;while(NULL != now->next)now = now->next;now->next = neww;return neww;
}
//插入节点
void merge(node* head, node* end)
{end->next = head;
}
//首尾相连
void detele(node* qian, node* need){qian->next = need->next;free(need);
}
//删除节点
int main()
{node *head = creat(1);node *end;node *now = head;int n, m, i, j;//n表示有多少个人,m表示报到几就自杀。scanf("%d%d", &n, &m);for(i=2;i<=n;i++)end = creatnode(head, i);merge(head, end);node *qian = end;for(i=1;i<n;i++){for(j=1;j<m;j++){now = now->next;qian = qian->next;}if(i!=(n-1)){detele(qian, now);now = qian->next;}}printf("%d", qian->data);return 0;}
谢谢观看!数组模拟实现和数学推理法在这里!
约瑟夫环---自杀环问题 简单明了的循环链表版相关推荐
- 约瑟夫环---自杀环问题 C++数组实现 数学推理
约瑟夫环–自杀环问题 约瑟夫环问题有着这样的历史: Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个 ...
- java实现约瑟夫环完整算法_Java简单实现约瑟夫环算法示例
Java简单实现约瑟夫环算法示例 发布时间:2020-10-01 14:19:56 来源:脚本之家 阅读:104 作者:perfect亮 本文实例讲述了Java简单实现约瑟夫环算法.分享给大家供大家参 ...
- —— 约瑟夫环(自杀环)的数学解法
首先简单介绍一下约瑟夫环: 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围. 从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从 ...
- 约瑟夫环问题(C语言数组和循环链表)
本文将用两种方式(数组和循环链表)求解约瑟夫环问题,为了更好理解,本文将从洛谷的P1996 约瑟夫问题出发. 题目描述 n个人围成一圈,从第一个人开始报数,数到 m的人出列,再由下一个人重新从1开始报 ...
- 循环链表构建及解决约瑟夫环、逢七过、链表逆置问题
文章目录 循环链表构建 测试 约瑟夫环 逢七过 链表逆置 循环链表构建 循环链表与链表区别就在于尾指针不再指向null而是指向头指针,形成环. 接口定义: package p1.接口;import j ...
- 约瑟夫环以及约瑟夫生死者游戏的C/Java代码实现
文章目录 前言 一.概念了解 二.实验设计 1.链表初始化 2.功能实现 3.完整代码 4.效果 三.约瑟夫生死者游戏 1.概念 2.解决 3.C实现 4.Java实现 前言 约瑟夫环问题,是一个经典 ...
- java实现简单的约瑟夫环问题(二)
Josephus(约瑟夫)问题的数学方法 前面的内容都是直接来来自于百度百科,后面才是我对这段话的理解 无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间 ...
- java实现简单的约瑟夫环问题
我自己学习数据结构的时候,总希望能找到很简单的入门代码,可总是很难找到,于是就想到能写一些简单的java代码. 在百度百科上面搜索到约瑟夫环的问题时,并没有发现java的简单实现,自己在下面弄也是弄 ...
- 约瑟夫环(简单版)c语言解决
传说约瑟夫当年活下来就是靠快速计算这个问题. n 个人围成一圈,编号依次为 1,2,3-n.从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈.以此类推,直 ...
最新文章
- usaco Number Triangles
- python将输出结果写入csv,在Python中将彩色输出写入CSV文件
- 从MATLAB帮助文档上学习 chirp
- 李宏毅机器学习课程9~~~深度学习技巧
- 华为上机试---购物单(算法:背包问题)
- js 判断字符是否以汉字开头
- ios 7.1企业证书无线安装
- Java 8 新特性:3-函数(Function)接口
- 列表左右移动 2017-03-23
- ubuntu 16.04/14.04 ORK 在 Kinect v2和 Kinect v1的安装(物体位姿估计)
- 南京邮电大学电子电路课程设计可编程音乐自动演奏电路
- DSP 2812: 使用C++封装SCI
- mysql 中 字典表设计_数据库怎么设计字典表
- SpringMVC工作原理图
- 2021清北学堂储备营Day1
- ViewBinding使用时出现Could not find method viewBinding() for arguments错误
- UE4遇到的各种奇葩问题
- vue3:加载本地图片等静态资源
- Android安全相关
- win10 系统禁用笔记本自带键盘的有效方法