Josephus】的更多相关文章

写出一个双向的循环链表,弄一个计数器,我定义的是到三的时候,自动删除当前节点,很简单. package Com; import java.util.Scanner; /* * 约瑟夫环问题,有n个人组成的圈,数到3的那个人出列,下个人继续从一开始 */ public class Josephus { public static void main(String[] args) { Scanner s = new Scanner(System.in); int n = Integer.parseI…
约瑟夫环问题 问题描述: Josephus问题可以描述为如下的一个游戏:N个人编号从1到N,围坐成一个圆圈,从1号开始传递一个热土豆,经过M次传递后拿着土豆的人离开圈子,由坐在离开的人的后面的人拿起热土豆继续进行游戏,直到圈子只剩下最后一个人.例如:M=0,N=5,则游戏人依次被清除,5号最后留下:如果M=1,N=5,那么被清除的人的顺序是2,4,1,5,最后剩下的是3号. 如下是两种解题方法: 建立一个N大小的数组,存储N个人是否还在圈子内(0为在圈子内,-1为已经离开圈子),依次循环遍历整个…
Given a circular single linked list.Write a program that deletes every kth node until only one node is left. After kth node is deleted, start the procedure from (k+1)th node. e.g.list is 1->2->3->4->5->1 k=3 1. You are at 1, delete 3. List…
问题描述:皇帝决定找出全国中最幸运的一个人,于是从全国选拔出 n 个很幸运的人,让这 n 个人围着圆桌进餐,可是怎么选择出其中最幸运的一个人呢?皇帝决定:从其中一个人从 1 开始报数,按顺序数到第 k 个数的人自动出局,然后下一个人从 1 开始报数,数到 k 的人出局…….如此直到最后只剩下约瑟夫一人,然后他就成为全国最幸运的人.请问约瑟夫最初的位置?(注:原问题略显暴力,故自创此趣味题目) 分析:把第一个开始报 1 的人标定为 1,然后按报数顺序依次标定其余的人为:2,3,……,n - 1,n…
问题描写叙述: 在<josephus Problem 0基础(使用数组)>中.我们提出了一种最简单直接的解决方式. 可是,细致审视代码之后.发现此种方案的效率并不高,详细体如今.当有人出局时,遍历数组仍须要对其进行推断, 这无疑做了无用功.减少了代码效率.在人数多时尤其明显. 解决方式: 当有人出局时,考虑将当前出局的人的前一个人(未出局)的下一个人置为当前出局的下一个人(未出局). 这样,便确保了每次对counter的添加都是有效的.遍历到的人都是还没有出局的.大大提升了程序的效率.这事实上…
/*以下程序用来解决Josephus问题,现在只是完成了M>N的情况,2015-08-20 22:22:20*//*发现一个问题:数组的赋值问题:char People[N]={1};并不代表所有的元素都是1啊,要确保全都是1,务必使用char People[N]={1,1,1,1};或者采用循环给数组赋值*/#include <stdio.h>#include <math.h>#define N 10 //#define M 3 //main(void){char p,Pe…
1009: josephus问题 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 549  Solved: 227 Description josephus问题其实就是一个游戏,一群小孩围成一个圈,设置一个数,这个数是个小于小孩总数大于0的一个整数,从第一个小孩开始报数,当其中一个小孩报到你设置的那个数的时候离开那个圈,这样一来反复报下去,直到只剩下最后一个小孩的时候那个小孩就是胜利者.现在的问题是设n个人围坐在一个圆桌周围,现在从第s个人开始报数,数…
问题描述: 设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m个的人出列,然后从出列的下一个人重新开始报数,数到第m个的人又出列,.......,如此反复直到所有的人出列为止. Josephus.c #include <stdio.h> #include <stdlib.h> typedef struct LNode { int data; struct LNode *next; }LNode,*LinkList; void CreateList(LinkList *l,…
问题描述 n个人围成一圈,号码为1-n,从1开始报数,报到2的退出,剩下的继续从1开始报数,求最后一个人的号码. 算法分析 最直观的算法是用循环链表模拟.从首节点开始,不断删除第二个节点,直到只剩一个节点为止.时间复杂度是O(2n). typedef struct josephusnode{ struct josephusnode *next; int item; }jnode; int listjosephus(jnode *head){ jnode *n = head; while(n->n…
利用循环链表模拟约瑟夫问题,把自杀的人的顺序排列出来 代码如下: #include<stdio.h> #include<stdlib.h> typedef int status; typedef struct node { status data; struct node *next; }LinkList; LinkList *create(int n) { LinkList *head,*p1,*p2; int i; head=(LinkList *)malloc(sizeof(…
博文链接:http://haoyuanliu.github.io/2016/04/18/Josephus/ 对,我是来骗访问量的!O(∩_∩)O~~ 约瑟夫问题(Josephus Problem)也称"丢手绢问题",是一道非常经典的算法问题,其解法涉及了链表.递归等算法和数据结构,本文主要分为如下三个内容: 使用C语言定义循环链表,通过遍历链表模拟事件处理过程: 使用数学方法,找出第n - 1步与第n步的关系,通过递归解决问题: 对第二种方法进行优化,加速递归过程,提高算法效率 循环链…
大概花了一个晚上搭一个中午的时间,完善了一个关于Josephus的程序,这个Josephus游戏可是非常经典的算法,作为一个想从事软件的人最好能够理解一下,毕竟这个计算机教材上也讲过类似题目,具体的关于问题的描述我就不多说了,这个Josephus一般都是用队列来实现,当然了对于一个具体的算法而言数据结构并不是第一重要的,最重要的还是算法本身.这个程序关键之处还是在于如何巧妙地实现对淘汰的人的处理,用队列比较好实现. public class CountDown {     public stat…
/* assume a header */ /* 双向循环链表 */ struct Node; typedef struct Node * PtrToNode; typedef PtrToNode List; typedef PtrToNode position; struct Node{ PtrToNode Previous; PtrToNode Next; int Ele; }; /* 删除双向循环链表中的元素例程 */ Position Delete( Position p ) { Pos…
#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAXINT 0x7fffffff #define MININT 0X80000000 //字符串中第一个只出现一次的字符 char firstSingle(char *str) { int a[255]; memset(a, 0, 255 * sizeof(int)); char *p = str; while (*p != '\0'){ +…
/************************************************************************/ /* Josephus问题--数组实现 */ /************************************************************************/ #include <stdio.h> #include <malloc.h> int Josephus(int times, int num…
import java.util.ArrayList; import java.util.ListIterator; public class Josephus { public static void main(String[] args) { pass(9, 5); // 注意这里的9为传递次数,要与报数次数区分开.即:传递次数 = 报数次数-1. } public static void pass(int m, int n) { int i, j, mPrime, numLeft; Arr…
  笔者昨天看电视,偶尔看到一集讲述古罗马人与犹太人的战争--马萨达战争,深为震撼,有兴趣的同学可以移步:http://finance.ifeng.com/a/20170627/15491157_0.shtml .   这不仅让笔者想起以前在学数据结构时碰到的Josephus问题:   据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人找到,于是决定了一个自杀方式,41个人排成一…
本文都是转的,一个是转博客,一个是转贴吧,前者详细,后者"强,无敌"! 博客转: 以前就知道约瑟夫问题是模拟,今天我才发现一些约瑟夫问题可以使用数学解法得出!真是强悍啊!约瑟夫问题真是博大精深!当然报数长度不定的应该只有模拟了吧,能用数学做的都是简化过的约瑟夫问题. 下面整理如下: 1.问题描述:n个人(编号1~n),从1开始报数,报到m的退出,剩下的人继续从1开始报数.按顺序输出列者编号.数学解法复杂度:O(n). 下面的代码摘自雨中飞燕博客,这个公式推的太牛了,我还没看懂... #…
线性表应用 --Josephus问题的解法(Python 版) Josephus问题描述:假设有n个人围坐一圈,现在要求从第k个人开始报数,报到第m个数的人退出.然后从下一个人开始继续报数并按照相同的规则退出,直到所有人退出.要求按顺序输各出列人的编号. 基于数组概念解法 1. 建立一个包含n个人的表 2. 找到第k个人,从那里开始 3. 处理过程中采用吧相应元素修改为0的方式表示已经退出,反复做: 4. 数m个(尚在坐的)人,遇到表的末端转回到下标0继续 4. 把表示第m个人的表元素修改为0…
 一. 简述Josephus问题 N个人站成一环,从1号开始,用刀将环中后面一个人“消灭“”掉,之后再将刀递给下一个人,这样依次处理,最后留下一个幸存者. 二. 求解方法  1.  约瑟夫问题如果使用链表来求解比较麻烦,这里采用循环队列的处理. 约瑟夫问题可以等价为l连续地DeQueue()两次,然后再将第一次DeQueue()的值EnQueue()入队列尾,直到队列中只剩下一个元素. # 循环队列代码如下: #include <stdio.h> #include <stdlib.h&g…
/************************************************************************* * * Josephus problem * * % java Ex_1_3_37 7 2 * 1 3 5 0 4 2 6 * *************************************************************************/ public class Ex_1_3_37 { public stat…
题目: 据说着名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人 开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止. 然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏. 最后一个自杀的是在…
Josephus 问题: 一群小孩围成一个圈,任意假定一个数 m,从第一个小孩起,顺时针方向数,每数到第 m 个小孩时,该小孩便离开.小孩不断离开,圈子不断缩小,最后剩下的一个小孩便是胜利者.究竟胜利的是第几个小孩呢? 案例分析: 解答这个问题,首先要定义一个数组,其元素个数就是小孩个数.必须预先设置一个小孩个数常量,以便定义一个数组. 对每个小孩赋以一个序号作为小孩的标志.由于数组是局部作用域的,一旦分配之后,就删不去,得等到作用域结束才会自动抹去,所以当小孩离开时,只能修改该数组元素值来表示…
出题:Josephus Cycle,约瑟夫环问题.k个数字连成一个环,第一个数字为1.首先从1开始计数删除第m个数字:然后从上次被删除的数字的下一个数字开始计数,删除第m个数字:重复进行第二步直到只剩下一个数字:输出最后剩下的一个数字: 分析: 解法1:考虑到问题的特殊性,可以使用哑元素表示删除的元素从而避免由于删除元素带来的额外操作,所以链表实现的话不用考虑删除操作,数组实现的话不用考虑内存移动操作.当然完全可以不适用哑元素,对于链表而言可以节省查找时间,数组的话需要增加数组元素的平移开销:…
约瑟夫环:用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至最后一个元素并输出该元素的值. 一.循环链表:建立一个有N个元素的循环链表,然后从链表头开始遍历并记数,如果计数值为M,则输出并删除该元素,继续循环(其实是N-1次),当当前元素与下一元素相同时退出循环. #include <stdio.h> #include <stdlib.h> #include <assert.h> typedef struct temp { int data; stru…
Josephus问题:设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m的人出列,然后从出列的下一个人重新开始报数,数到第m的人又出列.如此反复直到所有的人全部出列为止. 思路:构建一个没有头结点的循环链表,实现自己的删除函数,数到第几个结点就把这个结点从链表中删除,然后重新数. 难点在于写删除函数. 代码如下: #include <stdio.h> #include <stdlib.h> typedef struct student * PNode; typedef s…
Josephus问题,在这个古老的问题中,N个深陷绝境的人一致同意通过以下方式减少生存的人数.他们围坐一圈(位置记为0~N-1)并从第一个人报数,报到M的人会被杀死, 知道最后一个人留下来.传说中Josephus找到了不会被杀死的位置. 接收N和M的值,打印出被杀死的顺序: if __name__ == "__main__": num_people = int(input("深陷绝境的人数:")) num_kill = int(input("死亡数字:&q…
package com.qingfeng; /** * @author Administrator * 功能:约瑟夫问题: * 设编号分别为:1,2,...,n的n个人围坐一圈. * 约定序号为k(1 <= k < = n)的人从1开始计数,数到m的那个人出列, * 他的下一位又从1开始计数,数到m的那个人又出列,依次类推,直到所有人出列为止. */ public class Josephus { public static void main(String[] args) { // TODO…
问题描述 Josephus问题是一个非常古老的问题.它的范型描述为N个人(0到N-1)围成一圈报数,报道M的人会被剔除,直到最后一个人. 要求找出最后一个人的位置或这N个人被剔除的顺序. 解决思路 我们可以用一个队列来表示N个人,然后循环出队.注意,此时的出队只是一种"伪出队",只有轮到M位的数才真正出队,其他伪出队的数在队尾重新入队.以此来模拟问题的剔除方式.每次真出队的数组成的序列就是出队顺序,序列的最后一个数为最后一个人的位置. 具体代码 #include<iostream…
约瑟夫斯问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环. 有个囚犯站成一个圆圈,准备处决.首先从一个人开始,越过个人(因为第一个人已经被越过),并杀掉第k个人.接着,再越过个人,并杀掉第k个人.这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着. 问题是,给定了和,一开始要站在什么地方才能避免被处决?(引用自维基百科) public static void kill(int N,int M){ Queue<…