Java-约瑟夫问题(Josephus Problem)】的更多相关文章

博文链接:http://haoyuanliu.github.io/2016/04/18/Josephus/ 对,我是来骗访问量的!O(∩_∩)O~~ 约瑟夫问题(Josephus Problem)也称"丢手绢问题",是一道非常经典的算法问题,其解法涉及了链表.递归等算法和数据结构,本文主要分为如下三个内容: 使用C语言定义循环链表,通过遍历链表模拟事件处理过程: 使用数学方法,找出第n - 1步与第n步的关系,通过递归解决问题: 对第二种方法进行优化,加速递归过程,提高算法效率 循环链…
/************************************************************************* * * Josephus problem * * % java Ex_1_3_37 7 2 * 1 3 5 0 4 2 6 * *************************************************************************/ public class Ex_1_3_37 { public stat…
  笔者昨天看电视,偶尔看到一集讲述古罗马人与犹太人的战争--马萨达战争,深为震撼,有兴趣的同学可以移步:http://finance.ifeng.com/a/20170627/15491157_0.shtml .   这不仅让笔者想起以前在学数据结构时碰到的Josephus问题:   据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人找到,于是决定了一个自杀方式,41个人排成一…
 一. 简述Josephus问题 N个人站成一环,从1号开始,用刀将环中后面一个人“消灭“”掉,之后再将刀递给下一个人,这样依次处理,最后留下一个幸存者. 二. 求解方法  1.  约瑟夫问题如果使用链表来求解比较麻烦,这里采用循环队列的处理. 约瑟夫问题可以等价为l连续地DeQueue()两次,然后再将第一次DeQueue()的值EnQueue()入队列尾,直到队列中只剩下一个元素. # 循环队列代码如下: #include <stdio.h> #include <stdlib.h&g…
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…
问题描写叙述: 在<josephus Problem 0基础(使用数组)>中.我们提出了一种最简单直接的解决方式. 可是,细致审视代码之后.发现此种方案的效率并不高,详细体如今.当有人出局时,遍历数组仍须要对其进行推断, 这无疑做了无用功.减少了代码效率.在人数多时尤其明显. 解决方式: 当有人出局时,考虑将当前出局的人的前一个人(未出局)的下一个人置为当前出局的下一个人(未出局). 这样,便确保了每次对counter的添加都是有效的.遍历到的人都是还没有出局的.大大提升了程序的效率.这事实上…
问题: Caused by: java.util.concurrent.ExecutionException: java.lang.IndexOutOfBoundsException: Index: 0 at java.util.concurrent.FutureTask.report(FutureTask.java:122) at java.util.concurrent.FutureTask.get(FutureTask.java:192) at org.apache.hadoop.hive…
问题描述:皇帝决定找出全国中最幸运的一个人,于是从全国选拔出 n 个很幸运的人,让这 n 个人围着圆桌进餐,可是怎么选择出其中最幸运的一个人呢?皇帝决定:从其中一个人从 1 开始报数,按顺序数到第 k 个数的人自动出局,然后下一个人从 1 开始报数,数到 k 的人出局…….如此直到最后只剩下约瑟夫一人,然后他就成为全国最幸运的人.请问约瑟夫最初的位置?(注:原问题略显暴力,故自创此趣味题目) 分析:把第一个开始报 1 的人标定为 1,然后按报数顺序依次标定其余的人为:2,3,……,n - 1,n…
题目链接:https://vjudge.net/contest/28079#problem/G 题目大意:约瑟夫环问题,给你n和k(分别代表总人数和每次要数到k),求最后一个人的位置. 解题思路:因为n和k的范围都较大所以不能直接模拟,要推导出规律f(n) = (f(n-1) + k) % n. 代码: #include<iostream> #include<stdio.h> using namespace std; int main(){ int T; scanf("%…
约瑟夫问题 约瑟夫环问题是一个数学应用题:已知n个人(以编号1,2,3.....,n)围坐在一张圆桌的周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列,以此规律重复下去,直到圆桌的人全部出列.通常解决这类问题时我们把编号从0-n-1,最后+1即为原问题的解. >算法描述: 约瑟夫环运作如下: 1.一群人围在一起坐成环状 2.从某个编号开始报数(如:K) 3.数到某个数(如:M)的时候,此人出列,下一个人重新报数 4.一直循环,直到所有人出列 ,约…