您的位置:首页 > 编程语言 > Java开发

约瑟夫问题(丢手帕问题)的java实现

2013-09-08 00:01 513 查看
约瑟夫问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。借用一些自己感兴趣的球星的名字,使用Java语言简单实现了该问题。

package com.ohana.josephu;

import java.util.ArrayList;
import java.util.List;

/**
* 约瑟夫问题的java解决方案之一
*
* @author Ohana
* @date 2013-09-07
*/
public class JosephuProblem {

private List<String> list = new ArrayList<String>();
// 存储输出结果
private List<String> resultRlist = new ArrayList<String>();

public List<String> getList() {
return list;
}

public List<String> getResultRlist() {
return resultRlist;
}

public static JosephuProblem getInstance() {
JosephuProblem jp = new JosephuProblem();
// 初始化集合中的数据
jp.init();
return jp;
}

/**
* 初始化数据
*/
private void init() {
this.list.add("卡卡");
this.list.add("哈马西克");
this.list.add("莫德里奇");
this.list.add("皮尔洛");
this.list.add("蒂亚戈.席尔瓦");
this.list.add("巴神");
this.list.add("伊布");
this.list.add("卡瓦尼");
this.list.add("费莱尼");
this.list.add("小法老");
this.list.add("厄齐尔");
}

/***
* 约瑟夫问题的计算
* @param startPoint
*            开始位置
* @param distance
*            间距
*/
private void reduce(int startPoint, int distance) {
// 开始位置不能小于下阕(0)或者大于上阕(list.size()-1)
if (startPoint < 0 || startPoint > list.size() - 1) {
System.out.println("开始位置不存在");
return;
}
// distance不能为负数
if (distance < 0) {
System.out.println("间距不能小于0");
return;
}
// 集合不能没有数据
if (list.size() < 1) {
System.out.println("list中尚未初始化数据");
return;
}
// 每次计数开始的索引
int startIndex = startPoint;
// 删除的位置
int removeIndex;
while (list.size() > 0) {
// 【起始位置】+【间距】-1 =【len】
int len = startIndex + distance - 1;
// 如果 len > list.size();

if (len > list.size() - 1) {
removeIndex = len % list.size();

} else {
removeIndex = len;
}
String rmElement = list.remove(removeIndex);
resultRlist.add(rmElement);
startIndex = removeIndex;
}

}

public static void main(String[] args) {
JosephuProblem jp = JosephuProblem.getInstance();
System.out.println("处理前的顺序");
for (int i = 0; i < jp.getList().size(); i++) {
String item = jp.getList().get(i);
System.out.print(item + " , ");
}
System.out.println();
jp.reduce(2, 3);

System.out.println("处理后的顺序");
for (int i = 0; i < jp.getResultRlist().size(); i++) {
String item = jp.getResultRlist().get(i);
System.out.print(item + " , ");
}
}

}


  运行结果:

处理前的顺序
卡卡 , 哈马西克 , 莫德里奇 , 皮尔洛 , 蒂亚戈.席尔瓦 , 巴神 , 伊布 , 卡瓦尼 , 费莱尼 , 小法老 , 厄齐尔 ,
处理后的顺序
蒂亚戈.席尔瓦 , 卡瓦尼 , 厄齐尔 , 莫德里奇 , 伊布 , 卡卡 , 巴神 , 哈马西克 , 小法老 , 皮尔洛 , 费莱尼 ,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: