首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

约瑟夫环-Java兑现

2012-10-28 
约瑟夫环--Java实现import java.util.HashMapimport java.util.Map/** * 约瑟夫环--Java实现br * 有N

约瑟夫环--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;}}@Testpublic 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");}}

热点排行