`

趣味算法(一)Josephus问题

阅读更多

Josephus问题求解:

    设有n个人围坐一个圆桌周围,,现从第S人开始报数,数到第m的人出列,

    然后从出列的下一个重新开始报数,数列的第m个人又出列……如此重复,直
    到所有的人全部出列为止。对任意给定的n、s、m,求按出列次序得到的n个
    人员的顺序表。

 

分析:对于n个人,每一次出列一个人,余下的n-1个人仍然是一个Josephus问题,因此可以使用递归的方式,每次出列一个人,直到余下最后一个人。

 

public class Josephus {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		boolean[] nodes=new boolean[10];
		for(int i=0; i<nodes.length; i++){
			nodes[i]=false;
		}
		System.out.println("the left is "+ josephus(nodes,7,0,nodes.length));
		
	}
	
	public static int josephus(boolean[] nodes,int k, int start, int left){
		if(left==1){   //剩下最后一个人,找到这个人的坐标返回
			start=ignore(nodes,start);
			return ++start;
		}
		int i=1;        //从start开始计数,过滤掉出列的人,直到数到k-1
		while(i<k){
			if(nodes[start]==false){
				i++;
			}
			start++;
			if(start==nodes.length) start=0;
		}
		start=ignore(nodes, start);
		nodes[start]=true;            //找到数到k的人,出列
		left--;                                 //总人数减少
		System.out.println("nodes is deleted,pos:"+(start+1));
		return josephus(nodes,k,(++start)%nodes.length,left);   //重新开始下一轮
	}
	
	private static int ignore(boolean[] nodes,int start){
		while(nodes[start]) {
			start++;
			if(start==nodes.length) start=0;
		}
		return start;
	}
}

 运行结果:

nodes is deleted,pos:7
nodes is deleted,pos:4
nodes is deleted,pos:2
nodes is deleted,pos:1
nodes is deleted,pos:3
nodes is deleted,pos:6
nodes is deleted,pos:10
nodes is deleted,pos:5
nodes is deleted,pos:8
the left is 9
 
分享到:
评论

相关推荐

    基于Josephus问题的C语言教学设计分析.pdf

    通过上述知识点的分析和应用,基于Josephus问题的C语言教学设计旨在实现一个高效且具有趣味性的教学案例,不仅能够帮助学生理解并掌握C语言的基础知识,还能激发学生的学习兴趣,提高教学效果。

    约瑟夫环(Josephus problem)是一个经典的数学问题

    总的来说,约瑟夫环问题是一个挑战思维的趣味数学问题,它融合了数学的美和计算机科学的实用性,值得我们深入探讨和研究。通过解决这个问题,我们可以更好地理解递归、动态规划等重要概念,并锻炼我们的逻辑思维能力...

    简单Josephus环模拟器

    《简单Josephus环模拟器》是一款基于C#编程...通过这个模拟器,用户不仅能体验到Josephus问题的趣味性,还能深入理解C#编程和相关算法的应用。无论是对编程初学者还是经验丰富的开发者,这都是一个有价值的实践项目。

    数组,趣味的,数据结构,算法分析

    #### 一、约瑟夫(Josephus)问题 **问题描述:** 约瑟夫问题是经典的数组应用之一。该问题描述如下:假设$n$个人围坐成一圈,从第$s$个人开始按顺序报数,数到$m$的人会被淘汰出局,然后从被淘汰者下一位继续报数...

    php经典趣味算法实例代码

    【PHP趣味算法实例详解】 1. **猴子选大王算法** 这是一个经典的环形序列问题,也称为约瑟夫环(Josephus Problem)。在这个问题中,猴子们按照编号排列,每数到第m只猴子就被淘汰,直到只剩下一个猴子,这个猴子...

    趣味报数程序

    "约瑟夫问题"(Josephus Problem)是一个著名的理论问题,源自古罗马时期的传说,它在计算机科学中常被用来探讨算法和数据结构的应用。在这个问题中,人们站成一个圈,按照一定的规则每隔一定数量的人被淘汰,直到只...

    001.约瑟夫问题_约瑟夫问题_

    总的来说,约瑟夫问题是一个富有挑战性和趣味性的算法问题,它不仅锻炼了我们的逻辑思维能力,还启发我们寻找更高效的数据结构和算法。通过深入研究和实践,我们可以从中学习到如何处理复杂问题的策略和技巧。

    约瑟夫问题代码,约瑟夫问题代码

    约瑟夫问题,又称为约瑟夫环问题(Josephus Problem),是一个著名的理论问题,源自古罗马的一个传说。问题的基本设定是:人们按照一个固定的顺序站成一个圆圈,然后从某个人开始按顺时针方向计数,每数到特定数值的...

    约瑟夫环实验

    约瑟夫环(Josephus Problem)是一个著名的理论问题,源于古罗马时代的一个传说。这个问题是由数学家约瑟夫·弗雷德里克·本杰明·约瑟夫在1700年代提出,旨在探讨生存策略。在描述中提到的“有意思的、有趣!”,这...

    约瑟夫环 猴子选大王

    "约瑟夫环"(Josephus Problem)是一个著名的理论问题,源自古罗马时期的传说,它在计算机科学中常被用来探讨和解决数据结构与算法的问题。猴子选大王是约瑟夫环的一种趣味化表述,通常用编程语言如C来实现。 ...

    杀人游戏源代码

    然而,这里的“杀人游戏源代码”并非指实际的游戏规则和流程实现,而是指用编程语言实现的一种模拟约瑟夫环(Josephus Problem)的算法。约瑟夫环是计算机科学中的一个经典问题,与数据结构和算法设计密切相关。 ...

    程序设计基础(C) 视频.txt

    本书每一章中都用大量实用性较强的例题阐述基本知识点,同时在每章的最后都提供一个有一定难度且趣味性较强的综合实例,将本章中多个知识点有机地结合起来,力求读者能把理论与实践紧密结合,体会解决实际问题的过程...

Global site tag (gtag.js) - Google Analytics