`
hiyoku
  • 浏览: 30400 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

约瑟夫环--Java实现

阅读更多

import java.util.HashMap;
import java.util.Map;

/**
 * 约瑟夫环--Java实现<br>
 * 有N个同学围成一圈,从1开始依次编号,从第P个开始报数,报到第T个时,该同学出列,<br>
 * 然后从下一个同学开始报数,仍是报到T个出列,如此重复下去,<br>
 * 直到所有的同学都出列( 总人数不足T个时将循环报数),求同学出列的顺序。<br>
 * 
 * @author Administrator
 * 
 */
public class Joseph {

	public Map<Integer, Person> members = new HashMap<Integer, Person>();

	public String getJoseph(int n, int p, int t) {
		StringBuffer str = new StringBuffer();
		// 构造环
		for (int i = 1; i <= n; i++) {
			Person pn = new Person(i);
			if (i == 1) {
				pn.setBack(n);
			} else if (i == n) {
				pn.setNext(1);
			}
			members.put(i, pn);
		}
		// 当前同学
		Person current = members.get(p);
		// 开始报数
		while (n >= 1) {
			for (int i = 1; i <= t - 1; i++) {
				current = members.get(current.getNext());
				if (i == t - 1) {
					// 切换前后关系
					int back = current.getBack();
					int next = current.getNext();
					Person pastPerson = members.get(back);
					pastPerson.setNext(next);
					Person nextPerson = members.get(next);
					nextPerson.setBack(back);
					// 移除对象,并记录
					members.remove(current.getPosition());
					str.append(current.getPosition());
					if (n != 1) {
						str.append(",");
					}
					// 重新设置下一位为当前对象
					current = null;
					current = nextPerson;
				}
			}
			n--;
		}
		return str.toString();
	}
}

public class Person {

	private int back;// 上一位的位置
	private int position;// 我的位置
	private int next;// 下一位的位置

	public Person() {

	}

	public Person(int i) {
		back = i - 1;
		position = i;
		next = i + 1;
	}

	public int getBack() {
		return back;
	}

	public void setBack(int past) {
		this.back = past;
	}

	public int getPosition() {
		return position;
	}

	public void setPosition(int position) {
		this.position = position;
	}

	public int getNext() {
		return next;
	}

	public void setNext(int next) {
		this.next = next;
	}

}

@Test
public class JosephTest extends BaseTest{

	Joseph joseph = new Joseph();

	public void testCount(){
		String str= joseph.getJoseph(5, 2, 3);
		want.string(str).isEqualTo("4,2,1,3,5");
	}
}


分享到:
评论

相关推荐

    约瑟夫环-循环链表实现

    约瑟夫环,用循环链表实现,语言为Java。假设数到三的数出列。程序输出1到10的出列顺序。

    java编写的循环链表来实现约瑟夫环

    循环链表 实现约瑟夫环 java 自己写的 测试通过 有注释

    约瑟夫环java实现

    约瑟夫环java实现

    JAVA实现约瑟夫环

    用JAVA实现约瑟夫环

    约瑟夫环问题Java代码实现

    约瑟夫环问题Java代码实现 约瑟夫环问题是一种经典的算法问题,指的是在一个圆形排列的n个人中,每次从1开始报数,凡是报到m的人出局,问最后出局的人是谁。这个问题可以使用Java语言来实现。 约瑟夫环问题的Java...

    Java递归实现约瑟夫环应用问题

    约瑟夫环是一个数学的应用问题: 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,...

    java实现约瑟夫环问题Josephus

    java实现约瑟夫环问题Josephus 约瑟夫问题 * 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k(1,2,3...n)的人开始报数,数到m(1,2,3...)的那个人出列; * 他的下一个人又从1开始报数,...

    用Java和Python实现约瑟夫环算法的代码示例.zip

    用Java和Python实现约瑟夫环算法的代码示例.zip 用Java和Python实现约瑟夫环算法的代码示例.zip 用Java和Python实现约瑟夫环算法的代码示例.zip 用Java和Python实现约瑟夫环算法的代码示例.zip 用Java和Python实现...

    java用数组实现约瑟夫环

    java用数组实现的约瑟夫环问题。代码简单易懂。

    JAVA实现约瑟夫环的方法

    使用JAVA实现约瑟夫环,可以输入任意一组数字

    约瑟夫问题-基于java+双链表实现的约瑟夫问题题解.zip

    在这个问题的Java实现中,通常会使用数据结构来模拟这个过程。双链表是一种有效的方法,因为它可以方便地进行插入和删除操作。双链表的每个节点包含两个指针,分别指向它的前一个节点和后一个节点,这样可以轻松地在...

    约瑟夫环设计实现

    约瑟夫环是一种经典的数据结构问题,通过 Java 语言来实现约瑟夫环,可以让我们更好地理解算法和数据结构的思想。下面,我们将对约瑟夫环的设计实现进行详细的介绍。 课程设计介绍 约瑟夫环是一种典型的循环链表...

    求解约瑟夫环 数据结构循环链表 java求解

    约瑟夫环问题,也称为约瑟夫环序列或约瑟夫问题,是一个著名的理论问题,源自古罗马历史上的一个故事。...通过Java实现约瑟夫环,不仅能够锻炼编程能力,还能加深对数据结构和算法设计原理的理解。

    约瑟夫环,java

    这是一个java的约瑟夫问题代码,实现约瑟夫问题(循环链表)!

    利用java写的约瑟夫环

    以下是一个可能的Java实现: ```java public class JosephusProblem { private class Node { int data; Node next; public Node(int data) { this.data = data; this.next = null; } } public int solve...

    约瑟夫环的单链表实现

    【约瑟夫环的单链表实现】 约瑟夫环问题,又称约瑟夫环序列,是一个著名的理论问题,源自古罗马的一种传说。问题的基本设定是:人们站成一个圈,从某个人开始按顺时针方向报数,每报到特定数值的人会被排除出圈,...

    数据结构(Java)约瑟夫环

    以上代码给出了一个简单的Java实现,实际应用中可能需要考虑更高效的方法,如使用位运算或哈希映射来优化时间复杂度。在数据结构的学习过程中,理解并实现约瑟夫环可以帮助我们更好地掌握链表操作、循环结构以及递归...

    java顺序表实现约瑟夫环的两种方法

    本篇将详细介绍两种通过Java顺序表实现约瑟夫环的方法。 **方法一:通过数组移动** 在这种方法中,我们首先创建一个数组来模拟环状结构,数组的索引代表每个人的编号。每次执行“杀掉”操作时,我们将数组中指定...

    Java约瑟夫环演示源码.rar

    Java约瑟夫环演示Applet源码,程序组成:  MainApplet类:主要实现了界面的显示  MainSrc类:主要实现了界面图形变化的控制  ParaDialog类:实现了测试参数的输入

    java simith数和约瑟夫环问题代码

    Java 实现史密斯数和约瑟夫环问题代码 在本节中,我们将探讨 Java 实现史密斯数和约瑟夫环问题的代码实现。史密斯数和约瑟夫环问题是经典的编程题目,它们都是基础编程概念的延伸。 首先,让我们来了解一下约瑟夫...

Global site tag (gtag.js) - Google Analytics