`

趣味算法(一)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算法

    这是我自己写的一个josephus算法,使用顺序表做的

    labview的josephus问题编程

    labview的josephus问题编程

    一种利用labview求解Josephus问题的简单方法

    编程求Josephus问题:m个小孩围成一圈,从第一个小孩开始顺时针方向每数到第n个小孩时这个小孩就离开,最后剩下的一个小孩是胜利者。求第几个小孩是胜利者。

    C经典算法之约瑟夫问题(Josephus Problem)

    据说着名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1...

    Josephus问题c++程序

    Josephus问题的解答,分别使用不同的方法

    Josephus问题

    用顺序表处理Josephus问题 c语言

    Josephus约瑟夫问题代码

    Josephus

    约瑟夫(Josephus)环问题

    2、 约瑟夫(Josephus)环问题:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止。报m...

    Josephus问题.cpp

    教你如何用数据结构的思想来解决Josephus问题 而且是用C来描述的喔

    josephus问题源代码

    用c++解决了josephus问题:有n个人围在一个圆桌周围,现从第s个人开始报数,数到第m个人又出列…如此反复直到所有的人全部出列为只止。

    c++实现Josephus问题

    设有n个人围坐一圈并由1到n编号,从某个人开始报数,数到m的人出列,接着从出列的下一个人开始重新1到n报数,数到m的人又出列,如此反复地报数和出列,直到最后一个人出列为止,设计确定这n个人出列序列的程序

    (C++)Josephus问题---链式存储结构

    用链式存储结构实现Josephus问题,用户按照执行提示输入n、s、m,输出题目要求的出列顺序

    Josephus 问题的 C 语言代码

    Josephus 问题的 C 语言代码 ,链表实现,有查找抄作

    Josephus问题.zip

    生活不易,赚点积分...C语言实现,大二作业...

    Josephus问题资料

    关于Josephus问题数学公式推导和论证的几篇论文

    用循环单链表解决josephus问题的算法.rar_循环单链表

    用循环单链表解决josephus问题的算法

    约瑟夫环Josephus问题

    约瑟夫(Josephus)环问题:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止。报m的人...

    Josephus 约瑟夫问题(POJ)

    Josephus 约瑟夫问题(POJ)相关习题的源代码(1012,2359,1781,2244,3517,2939,2800)

    单向和双向循环链表实例(Josephus环问题)

    Josephus问题可以描述为如下的一个游戏:N个人编号从1到N,围坐成一个圆圈,从1号开始传递一个热土豆,经过M次传递后拿着土豆的人离开圈子,由坐在离开的人的后面的人拿起热土豆继续进行游戏,直到圈子只剩下最后一...

    Josephus排序

    时间复杂度为O(n),空间复杂度为O(1),为算法导论思考题Josephus排序问题1答案

Global site tag (gtag.js) - Google Analytics