约瑟夫问题(丢手帕问题)的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 + " , "); } } }
运行结果:
处理前的顺序
卡卡 , 哈马西克 , 莫德里奇 , 皮尔洛 , 蒂亚戈.席尔瓦 , 巴神 , 伊布 , 卡瓦尼 , 费莱尼 , 小法老 , 厄齐尔 ,
处理后的顺序
蒂亚戈.席尔瓦 , 卡瓦尼 , 厄齐尔 , 莫德里奇 , 伊布 , 卡卡 , 巴神 , 哈马西克 , 小法老 , 皮尔洛 , 费莱尼 ,
相关文章推荐
- 丢手帕问题 (约瑟夫问题)Java实现
- 常用算法Java实现之(1)------约瑟夫问题(丢手帕问题)
- 丢手帕问题 (约瑟夫问题)Java实现
- 约瑟夫问题的另类java实现
- 用PHP实现丢手帕问题(约瑟夫问题)
- 约瑟夫问题(丢手帕问题)的数组实现
- 自己用java代码实现的:“约瑟夫”问题
- java实现约瑟夫问题
- 约瑟夫问题java实现
- java实现猴子选大王问题(约瑟夫问题)
- 数组实现的约瑟夫问题(Java)
- 猴子选大王(约瑟夫问题)JAVA实现
- 用Java实现约瑟夫问题
- 约瑟夫问题(Java实现)
- 约瑟夫问题的JAVA实现
- 约瑟夫问题c、Java语言实现
- Java实现约瑟夫算法问题
- 约瑟夫问题java语言实现代码
- java实现约瑟夫问题
- 丢手帕问题(约瑟夫问题-数组实现)