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约瑟夫环队列 约瑟夫环java实现
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Phaser用蝴蝶动画由队列变换为奥运五环
Phaser用蝴蝶动画由队列变换为奥运五环,五种形态各异的蝴蝶组成奥运五环
phaser Olympic Ring 奥运五环 蝴蝶动画 -
约瑟夫环的队列实现
//循环队列//约瑟夫环#include#include#include#define Size 10using namespace std;cl
#include ios #define -
安装MySQL时缺少很多lib文件
1 MySQL的安装方法介绍 当今的互联网企业中,MySQL数据库大多运行在linux系列操作系统。若应用场景不同、版本不同,MySQL数据库的安装方法也会有区别,下面把常见的几种方法介绍给朋友们1.1 yum、rpm方式安装
安装MySQL时缺少很多lib文件 MySQL installation mysql bc