问题描述:编号为1,2…n的n个人按顺时针方向围坐在一张圆桌周围,没人持有一个密码(正整数)。一开始人选一个正整数作为报数上线值m,从第一个人开始按顺时针方向自1报数,报到m时停止报数,报m的那个人出列,将他的密码作为新的m值,从他顺时针方向的下一个人开始重新从1报数,数到m的那个人又出列;如此下去,直至圆桌周围的人全部出列为止。这个游戏的实现只需将每个人的信息作为一个结点,节点中存放每个人的编号
Java约瑟夫前言一、约瑟夫1、故事2、例题3、题解A、List模拟删除B、动态规划+递归C、动态规划+循环总结参考文献 前言通过学习Java约瑟夫问题,理解大问题拆解成小问题,然后小问题之间递推求解,这也是动态规划的核心思想。一、约瑟夫1、故事约瑟夫斯是1世纪的一名犹太历史学家。他在自己的日记中写道,他和他的40个战友被罗马军队包围在洞中。他们讨论是自杀还是被俘,最终决定自杀,并以抽
鉴于毕设是关于算法的,我又是用Java实现的,所以开始学习Java实现的一些算法。 第一个就是约瑟夫,因为以前学数据结构的时候用C写过。不知道自己当时太笨还是怎么着,写出来的代码一长串,怎么看怎么麻烦,Java的简单多了。 1.Java循环链表版的 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
转载 2023-05-31 20:45:35
30阅读
循环链表 循环链表,顾名思义,链表整体要形成一个圆环状。在单向链表中,最后一个节点的指针为null,不指向任何结点,因为没有下一个元素了。要实现循环链表,我们只需要让单向链表的最后一个节点的指针指向头结点即可。 约瑟夫 问题描述: 传说有这样一个故事,在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫 ...
转载 2021-08-09 17:44:00
172阅读
2评论
#include<iostream.h> struct Node{ int data; struct Node *next;}; int main(){ int m,n; cout<<"请输入m的值"; cin>>m; cout<<"请输入n的值"; cin>>n;
原创 2007-06-09 09:28:46
3452阅读
1点赞
8评论
约瑟夫问题的原来描述为,设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全部出圈为止
原创 2018-08-05 11:03:03
3757阅读
1点赞
这是一道比较经典的循环链表问题,在华为上机笔试中也出现过。约瑟夫是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。 #include #include typedef struct node//节点存放一个数据和指向下一个节点的指针{ int data; struct node* pnext;} Node;Node *link_create(int n)//创建n个节点的循环链表{ //先创建第1个节点 Node *p
转载 2013-07-29 19:19:00
168阅读
2评论
递归解法的关键:找到n个人参加游戏的获胜者编号和n-1个人参加游戏的获胜者编号之间的联系,即递归表达式如何得出。我们假设有n个人参加游戏,这n个人的编号分别是:队列(1):1, 2, 3, 4, 5, 6, … , n,共n个。这n个人横着排成一排报数,为了方便理解起见,假设k=1,m=5(即从编号1开始报数,报到5的出列,一排报完了后回到队列开头接着报。)(这样的报数跟围成一圈报数是一模一样的,
我们首先来看一下约瑟夫问题:    给定m个人,m个人围成一圈,在给定一个数n,从m个人中的第一个人每第n个人便将其除去,求被最后一个出去的人的编号。  思路:建立一个长度为m+1的数组,将其的内容初始化为0至m我们设置变量i与j,i代表数组元素的下表,因为我设置的数组长度为m+1,所以数组下标就为每个人的编号,当i==m的时候,我们将i置为0,让其从头开始便利。变量j为判断当前元素是否为排列的
转载 2023-06-01 21:56:35
0阅读
  约瑟夫问题,是一个经典的循环链表问题,题意是:已知 n 个人(分别用编号 1,2,3,…,n 表示)围坐在一张圆桌周围,从编号为 k 的人开始顺时针报数,数到 m 的那个人出列;他的下一个人又从 1 开始,还是顺时针开始报数,数到 m 的那个人又出列;依次重复下去,直到圆桌上剩余一个人。如图所示,假设此时圆周周围有 5 个人,要求从编号为 3 的人开始顺时针数数,数到 2 的那个人出列: 出
原创 2021-04-18 09:42:43
212阅读
public class Josephus { static class Node{ int val; Node next; Node(int v){ val=v; } }//成员类,代表节点,类似于数据结构中的结构体 public static void main(String[] args) { int N=9;//这个表示总人数 int M=5;//数到几的人出列 Node t=new No
约瑟夫问题是比较经典的问题,原来做的题目是依次输出数字,而原来的循环链表结构不改变,今天遇到一道题是要求按照顺序重新组成一个循环链表。 题目:一些人围坐一圈报数,形成一个循环链表,当报数是m或m的倍数时出将节点从单链表中删除,重新加入新的循环链表,最后形成一个新的循环链表。   struct Node  {    &nbs
原创 2012-09-12 22:11:47
879阅读
一、概念1. 环形链表环形链表是另一种形式的链式存贮结构。它的特点是表中最后一个结点的指针域指向第一个结点,整个链表形成一个。2. 约瑟夫问题设编号为1,2,…,n 的n个人围坐一圈,约定编号为 k (1 ≤ k ≤ n) 的人从1开始报数,数到m的那个人出列,出列的人的下一位又从1开始报数,数到m的那个人又出列,以此类推,直到所有人都出列为止,由此产生一个出队编号的队列。二、环形链表约瑟夫
问题来历:约瑟夫问题是个有名的问题:有序号1,2…n个程序员围成一个大圈圈,从编号为K(1<=k<=n)的程序员从1开始报数,数到m的那个程序员出列,可以去挑选对象(真对象,不New不Joke),他的下一位程序员又从1开始报数,数到m的人又出列挑选对象,美滋滋~,依次类推,到最后一个程序员不给对象,只给了一堆bug,并在程序上线的时候祭了天。。。额。。是一个凄美的爱情故事!思路分析:构
什么是约瑟夫问题?而这实际上就是一个经典的数学问题:而用一个更生活化的例子来阐述:几个人围坐在一张圆桌上,然后开始数数,数到指定数则淘汰,然后再重1开始数,直到还剩最后一个人则为胜利者。而具体代码如何来实现呢?首先还是基于上次的那个链表进行扩展:接着构造一个循环链表,为了使代码更加的清晰,这里采用面向对象的方法来进行封装接下来就是去实现这个add方法,如何在这个方法中实现一个循环链表呢?下面用图
原创 2017-07-01 15:46:00
112阅读
#include <iostream>#include <stdio.h>#include <stdlib.h>using namespace std;typedef struct node{ ...
原创 2022-09-15 14:56:30
121阅读
问题描述:编号为1,2…n的n个人按顺时针方向围坐在一张圆桌周围,没人持有一个(正整数)。一开始人选一个正整数作为报数上线值m,从第一个人开始按顺时针方向自1报数,报到m时停止报数,报m的那个人出列,将他的作为新的m值,从他顺时针方向的下一个人开始重新从1报数,数到m的那个人又出列;
原创 精选 2023-02-13 14:38:21
175阅读
Joseph 问题: 有 10 个小朋友按编号顺序 1,2,。。。,10 顺时针方向围成一圈。从1号开始顺时针方向 1,2,。。。,9 报数,凡报数 9 者出列(显然,第一个出圈为编号 9 者) 最后一个出圈者的编号是多少?第 5 个出圈者的编号是多少?实现循环链表#include "stdlib.h" #include "stdio.h" typedef struct LNode{
原创 3月前
76阅读
循环链表的实例——约瑟夫约瑟夫(Josephus)问题是由古罗马的历史学家约瑟夫(Josephus)提出的,该问题具体描述是:设有编号为1,2,……,n的n个人围成一个圈,从第1个人开始报数,报m(m为报数上限)的人将出列被杀掉,再从他的下一个人起重新报数,如此下去,知道所有人全部出列为止。此时,最后一个出列的将是幸存者。当任意给定n和m后,设计算法求n个人出列的次序。由于约瑟夫问题中要求n
设有n个人依次围成一圈,从第1个人开始报数,数到第m个人出列,然后从出列的下一个人开始报数,数到第m个人又出列,…,如此反复到所有的人全部出列为止。设n个人的编号分别为1,2,…,n,打印出列的顺序。 【算法分析】 本题我们可以用数组建立标志位等方法求解,但如果用上数据结构中循环链的思想,则更贴切题
原创 2021-06-04 20:17:06
203阅读
  • 1
  • 2
  • 3
  • 4
  • 5