`
llartemisll
  • 浏览: 952 次
  • 性别: Icon_minigender_1
  • 来自: 天津
文章分类
社区版块
存档分类
最新评论

约瑟夫环问题

阅读更多

写了个约瑟夫环的实现,下边把代码分享出来,欢迎大家指点,或者有什么更好的设计思路欢迎提出。

 

我的设计思路是:定义一个linkedlist,删掉数到4的人,讲最后的余数放到链表的头部,然后再次对链表进行删除,这样不断的递归调用,完成谁是最后一个留下的!

 

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

/**
 * FileName :LinkedListHigh.java
 * 
 * @CreateTime :2011-5-16上午11:51:46
 * @author : artemis
 * @function:
 */
public class LinkedListHigh {
	private static LinkedList<People> list = new LinkedList<People>();
	private static List<People> listxx = new ArrayList<People>();//存放被取出人员的顺序
	private final static int peopleNum = 4;//数到几出来
	int surplus = 0;//余数

	public static void main(String[] args) {
		addEntity();//向链表中加入人
		People people = getPeople(peopleNum);//得到最后出来的人
		System.out.println(people.getId() + "---" + people.getName());
		System.out.println("出队的顺序:");
		int i = 1;
		for (People p : listxx) {
			if (i < 7) {//只显示前6个出列人的顺序
				System.out.println("编号:" + p.getId() + "--------" + "姓名:"
						+ p.getName());
				i++;
			} else {
				break;
			}
		}
	}

	private static People getPeople(int peopleNum) {
		int surplus;
		int removeNum;
		if (peopleNum == 1) {
			return list.getLast();
		}
		if (list.size() >= peopleNum) {//判断链表长度是否大于要取出的数
			surplus = list.size() % peopleNum;//求余
			removeNum = list.size() / peopleNum;//求整
			for (int i = 1; i <= removeNum; i++) {
				addList(peopleNum * i - 1);//把取出的人放进list中
			}
			for (int i = removeNum; i >= 1; i--) {
				list.remove(peopleNum * i - 1);//把取出的人从链表中删除
			}
			if (surplus != 0) {//如果有余数
				for (int j = 0; j < surplus; j++) {
					list.addFirst(list.pollLast());//把余下的放到链表的头部去
				}
			}
			getPeople(peopleNum);//递归自己,开始下一轮的删除链表的人员
		}
		list = getSurplusLink();//链表的长度小于要取出的数据
		return list.get(0);
	}

	private static LinkedList<People> getSurplusLink() {//删除剩下的数据
		if (list.size() > 1) {
			int yy = peopleNum % list.size();
			if (yy != 0) {
				addList(yy - 1);
				list.remove(yy - 1);

			} else {
				addList(list.size() - 1);
				list.remove(list.size() - 1);
			}
			getSurplusLink();
		}
		return list;
	}

	private static void addList(int index) {
		listxx.add(list.get(index));
	}

	private static void addEntity() {
		list.add(new People(1, "a"));
		list.add(new People(2, "b"));
		list.add(new People(3, "c"));
		list.add(new People(4, "d"));
		list.add(new People(5, "e"));
		list.add(new People(6, "f"));
		list.add(new People(7, "g"));
		list.add(new People(8, "h"));
		list.add(new People(9, "i"));
		list.add(new People(10, "j"));
		list.add(new People(11, "k"));
		list.add(new People(12, "l"));
		list.add(new People(13, "m"));
	}
}

class People {

	private int id;
	private String name;

	public People() {
	}

	public People(int id, String name) {
		this.id = id;
		this.name = name;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}
分享到:
评论

相关推荐

    循环队列和约瑟夫环问题

    循环队列和约瑟夫环问题 循环队列是一种特殊的队列结构,它的特点是队列的末尾元素连接着队列的开头元素,形成一个环形结构。这种数据结构可以用来解决约瑟夫环问题。 约瑟夫环问题是一个经典的问题,它是由古罗马...

    敢死队问题课程设计(约瑟夫环问题的应用)

    【敢死队问题(约瑟夫环问题的应用)】是一个经典的计算机科学问题,它涉及到数据结构和算法的设计。在这个问题中,M个敢死队员通过循环计数的方式决定执行任务的顺序,每数到5的人将执行任务并退出,直至只剩下一个...

    用循环链表实现约瑟夫环问题

    使用c语言中的循环链表及结构体实现约瑟夫环问题

    数据结构约瑟夫环问题

    数据结构中的约瑟夫环问题是一种经典的编程问题,它涉及到链表这一数据结构的应用。在本文中,我们将深入探讨约瑟夫环问题的背景、原理以及如何使用链表来求解这一问题,同时分析给定代码的具体实现细节。 ### ...

    约瑟夫环问题算法描述和程序实现(C#)

    约瑟夫环问题,也称为约瑟夫环序列或约瑟夫问题,是一个著名的理论问题,源自古罗马历史上的一个故事。在这个问题中,人们围成一个圈,并按照一定的规则依次淘汰,最后留下来的人被称为“幸存者”。具体规则是:从...

    约瑟夫环问题用C++代码实现

    约瑟夫环问题,也称为约瑟夫问题,是一个经典的理论问题,源于古罗马时期的传说。问题描述了一群人围坐成一个圆圈,按照一定的规则进行报数,每数到特定数字的人会被排除,直到所有人都被排除。在这个场景中,我们...

    c++多种方法解决约瑟夫环问题

    多种方法解决约瑟夫环问题,1.顺序表2.循环链表3.循环队列4.普通一位数组

    约瑟夫环问题(C++)

    约瑟夫环问题,也被称为约瑟夫环序列或约瑟夫问题,是一个著名的理论问题,源自古罗马历史上的一个故事。在这个问题中,人们站成一个圈,并按顺时针方向编号。从某个人开始,每隔特定的人数,这个人就会被排除出圈,...

    详细介绍约瑟夫环问题解析.docx

    约瑟夫环问题解析 约瑟夫环问题是计算机科学和数学中一个著名的问题,它是指在一个圆圈中的人按照一定的规则依次出列的问题。该问题的解析报告将从以下几个方面进行讲解: 一、问题描述 约瑟夫环问题可以用以下...

    约瑟夫环问题的编程实现

    约瑟夫环问题,也称为约瑟夫环序列或约瑟夫问题,是一个著名的理论问题,源自古罗马历史的一个故事。在数学和计算机科学中,它通常被用来演示各种算法,特别是循环移位和递归算法。这个问题描述如下:假设有一群人围...

    用C语言实现约瑟夫环问题

    《C语言实现约瑟夫环问题详解》 约瑟夫环问题,又称约瑟夫环序列,是一个著名的理论问题,源自古罗马的一个传说。在这个问题中,人们围成一个圈,按照一定的规则逐个淘汰,直到剩下最后一个人为止。这个问题在...

    约瑟夫环问题用循环队列解决

    用循环队列解决约瑟夫环问题减少用顺序表在出对是循环移动带来的空间复杂度

    1模拟轮盘抽奖游戏2模拟报数游戏(约瑟夫环问题)_抽奖轮盘_模拟报数游戏_模拟轮盘抽奖游戏_游戏_用python实现_

    在本项目中,我们将探讨如何使用Python编程语言来实现两种有趣的数学和计算机科学相关的游戏:模拟轮盘抽奖游戏和模拟报数游戏,也称为约瑟夫环问题。这两个游戏不仅有趣,而且能帮助我们理解循环、列表操作以及算法...

    约瑟夫环问题,C语言编写

    数据结构中的约瑟夫环问题 C语言编写,已经测试通过

    约瑟夫环问题的源代码(c++)

    约瑟夫环问题的源代码分析 约瑟夫环问题是计算机科学中的一种经典问题,描述的是10个小孩围坐在一圈,并给他们依次编号,指定从第s个小孩开始报数(从1~n报数),报到n的小孩出列,然后依次重复下去,直到所有的...

    C语言编写的关于约瑟夫环问题的程序

    标题中的“C语言编写的关于约瑟夫环问题的程序”指的是使用C编程语言实现的一个经典算法问题——约瑟夫环(Josephus Problem)。约瑟夫环问题是一个理论上的问题,通常在计算机科学和数学中被用作示例,以讨论和解决...

    数据结构实验报告--约瑟夫环问题

    实验报告的主题是“约瑟夫环问题”,这是一个经典的数据结构问题,源于数学家约瑟夫·弗朗西斯·里斯提出的假设情景。该问题描述了一群人围成一个圈,从某个人开始按顺时针方向依次报数,每当数到特定数值的人会被...

Global site tag (gtag.js) - Google Analytics