问题描述:编号为1,2…n的n个人按顺时针方向围坐在一张圆桌周围,没人持有一个密码(正整数)。一开始人选一个正整数作为报数上线值m,从第一个人开始按顺时针方向自1报数,报到m时停止报数,报m的那个人出列,将他的密码作为新的m值,从他顺时针方向的下一个人开始重新从1报数,数到m的那个人又出列;如此下去,直至圆桌周围的人全部出列为止。这个游戏的实现只需将每个人的信息作为一个结点,节点中存放每个人的编号
语塞夫
原创 2022-09-04 05:53:24
115阅读
关键字: 链表 约瑟夫     这几天为了准备笔试忙着复习C语言,决定把当时学C时的一些经典问题再温习一下,当时啊,学的稀里糊涂的,呵呵,现在回头来仔细写一写代码,就算是纪念当时的个性十足的赵老师了吧!    约瑟夫问题的:编号为1,2,....,N的N个人按顺时针方向围坐一圈,每人持有一个密码(正整数),一开始任选一个正整数
递归解法的关键:找到n个人参加游戏的获胜者编号和n-1个人参加游戏的获胜者编号之间的联系,即递归表达式如何得出。我们假设有n个人参加游戏,这n个人的编号分别是:队列(1):1, 2, 3, 4, 5, 6, … , n,共n个。这n个人横着排成一排报数,为了方便理解起见,假设k=1,m=5(即从编号1开始报数,报到5的出列,一排报完了后回到队列开头接着报。)(这样的报数跟围成一圈报数是一模一样的,
约瑟夫问题是比较经典的问题,原来做的题目是依次输出数字,而原来的循环链表结构不改变,今天遇到一道题是要求按照顺序重新组成一个循环链表。 题目:一些人围坐一圈报数,形成一个循环链表,当报数是m或m的倍数时出将节点从链表中删除,重新加入新的循环链表,最后形成一个新的循环链表。   struct Node  {    &nbs
原创 2012-09-12 22:11:47
879阅读
node* JosephCircle_OP(node*& phead, size_t del) //约瑟夫 优化写法  { assert(phead); node* cur = phead, *prev = phead; if(!del)   //对参数判断 { printf("error parameter!"); } while(cur->next !=
原创 2015-11-29 20:13:25
376阅读
1.冒泡排序:void BubbleSort(ListNode *&pHead)//冒泡排序 { ListNode *tail=NULL; assert(pHead!=NULL&&pHead->_next!=NULL); while(tail!=pHead->_next) { ListNode *prev=
原创 2016-03-28 20:53:58
646阅读
约瑟夫——围成一圈,定义一个数值K,从任意位置开始计数,每走K步删除当前位置结点,直到剩下最后一个结点,求最后一个结点
原创 2016-01-05 00:09:53
1185阅读
1点赞
一、概念1. 环形链表环形链表是另一种形式的链式存贮结构。它的特点是表中最后一个结点的指针域指向第一个结点,整个链表形成一个。2. 约瑟夫问题设编号为1,2,…,n 的n个人围坐一圈,约定编号为 k (1 ≤ k ≤ n) 的人从1开始报数,数到m的那个人出列,出列的人的下一位又从1开始报数,数到m的那个人又出列,以此类推,直到所有人都出列为止,由此产生一个出队编号的队列。二、环形链表约瑟夫
   1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 typedef struct person{ 5     int num; 6     struct person* next; 7 }P; 8 int main() 9 {10     int n,m;11     scanf(
转载 2021-03-28 08:49:57
516阅读
2评论
我们首先来看一下约瑟夫问题:    给定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阅读
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
设有n个人依次围成一圈,从第1个人开始报数,数到第m个人出列,然后从出列的下一个人开始报数,数到第m个人又出列,…,如此反复到所有的人全部出列为止。设n个人的编号分别为1,2,…,n,打印出列的顺序。 【算法分析】 本题我们可以用数组建立标志位等方法求解,但如果用上数据结构中循环链的思想,则更贴切题
原创 2021-06-04 20:17:06
203阅读
//Dev c++#include<stdio.h>#include<malloc.h>#include<string.h>//调用putchar函数typedef struct stu{ int num; struct stu*next;}stu,*pointer;int main(){ int i,n,m,count; pointer p,q,r; r=p=q=(pointer)malloc(sizeof(pointer)); p->num=1;p->next=NULL;//无头结点 printf("Input n and m:&q
转载 2012-04-10 22:01:00
67阅读
2评论
Java之约瑟夫前言一、约瑟夫1、故事2、例题3、题解A、List模拟删除B、动态规划+递归C、动态规划+循环总结参考文献 前言通过学习Java约瑟夫问题,理解大问题拆解成小问题,然后小问题之间递推求解,这也是动态规划的核心思想。一、约瑟夫1、故事约瑟夫斯是1世纪的一名犹太历史学家。他在自己的日记中写道,他和他的40个战友被罗马军队包围在洞中。他们讨论是自杀还是被俘,最终决定自杀,并以抽
循环链表 循环链表,顾名思义,链表整体要形成一个圆环状。在单向链表中,最后一个节点的指针为null,不指向任何结点,因为没有下一个元素了。要实现循环链表,我们只需要让单向链表的最后一个节点的指针指向头结点即可。 约瑟夫 问题描述: 传说有这样一个故事,在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫 ...
转载 2021-08-09 17:44:00
172阅读
2评论
双向链表,又称为双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双
原创 2022-06-29 14:54:06
189阅读
问题来历:约瑟夫问题是个有名的问题:有序号1,2…n个程序员围成一个大圈圈,从编号为K(1<=k<=n)的程序员从1开始报数,数到m的那个程序员出列,可以去挑选对象(真对象,不New不Joke),他的下一位程序员又从1开始报数,数到m的人又出列挑选对象,美滋滋~,依次类推,到最后一个程序员不给对象,只给了一堆bug,并在程序上线的时候祭了天。。。额。。是一个凄美的爱情故事!思路分析:构
问题表述为:设编号为1,2,...,n的n个人围坐一圈,约定编号为K(1<=k<=n)的人开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依此类推,直到所有人出列为止,由此产生一个出队编号的序列 构建环形队列 package jiegou; //问题表述为:设编号为1, ...
转载 2021-08-15 00:01:00
174阅读
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
  • 3
  • 4
  • 5