`
yangphere
  • 浏览: 78056 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

蚂蚁爬杆问题的java实现

阅读更多
/** 
 * Filename:    com.yangphere.demo.AntWalker.java 
 * Description:  题目描述: 有一根27厘米的细木杆, 在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。 木杆很细,不能同时通过一只蚂蚁。
 * 开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。 当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。
 * 假设蚂蚁们每秒钟可以走一厘米的距离。 编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。
 * Copyright:   Copyright (c)2009 
 * Company:     yangphere 
 * @author:     yangphere 
 * @version:    1.0 
 * Create at:   2009-6-28
 * 
 * Modification History: 
 * Date			Author		Version		Description 
 * ------------------------------------------------------------------ 
 * 2009-6-28	yangphere	1.0			1.0 Version 
 */
package com.yangphere.demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 配合逻辑分析给出一种简单的实现方式
 * 其中有个很重要的原则是:当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走,其实和假设两只蚂蚁之间可以无障碍穿过时是一样的(忽略蚂蚁自身的长度)。
 * 
 * @author yangphere
 * 
 */
public class AntWalker {

	/**
	 * 细木杆长度
	 */
	private static final int TOTAL_LENGTH = 27;

	/**
	 * 蚂蚁的位置
	 */
	private static final List<Integer> ANT_PER_POSITION = new ArrayList<Integer>();

	/**
	 * 初始化蚂蚁位置
	 */
	static {
		ANT_PER_POSITION.add(3);
		ANT_PER_POSITION.add(7);
		ANT_PER_POSITION.add(11);
		ANT_PER_POSITION.add(17);
		ANT_PER_POSITION.add(23);
	}

	/**
	 * 
	 * @author yangphere 2009-6-28
	 * @param args
	 */
	public static void main(String[] args) {
		if (!check()) {
			System.out.println("参数错误!");
		} else {
			System.out.println("最短时间是:" + getMinTime() + "秒");
			System.out.println("最长时间是:" + getMaxTime() + "秒");
		}
	}

	/**
	 * 获得最长时间 根据那个原则,无需关心蚂蚁碰撞的问题,最长时间就是所有蚂蚁中距细杆一端最长的那只蚂蚁的爬完时间
	 * 
	 * @author yangphere 2009-6-29
	 * @return
	 */
	private static int getMaxTime() {
		// 对蚂蚁位置排序
		Collections.sort(ANT_PER_POSITION);
		// 获得最靠两端的蚂蚁
		int oneSide = ANT_PER_POSITION.get(0);
		int anotherSide = ANT_PER_POSITION.get(ANT_PER_POSITION.size() - 1);

		// 获得一只蚂蚁距两端最长的距离
		int oneMax = (oneSide > (TOTAL_LENGTH - oneSide)) ? oneSide
				: TOTAL_LENGTH - oneSide;
		int antherMax = (anotherSide > (TOTAL_LENGTH - anotherSide)) ? anotherSide
				: TOTAL_LENGTH - anotherSide;

		return oneMax > antherMax ? oneMax : antherMax;
	}

	/**
	 * 获得最短时间 根据那个原则,最短时间就是距细杆中间最近的那只蚂蚁爬完细杆最短的那端所花的时间
	 * 
	 * @author yangphere 2009-6-29
	 * @return
	 */
	private static int getMinTime() {

		// 蚂蚁距一端的距离
		int oneSide = getNearCenterAnt();

		// 蚂蚁距另一段的距离
		int anotherSide = TOTAL_LENGTH - oneSide;

		return oneSide < anotherSide ? oneSide : anotherSide;
	}

	/**
	 * 获得最接近细杆中间的蚂蚁
	 * 
	 * @author yangphere 2009-6-29
	 * @return
	 */
	private static int getNearCenterAnt() {
		// 中间位置
		double center = TOTAL_LENGTH / 2.0;
		// 离中间最近的蚂蚁的位置
		int antNearCenter = 0;

		Map<Integer, Double> map = new HashMap<Integer, Double>();

		double antNearPosition = center - ANT_PER_POSITION.get(0);
		for (Integer ant : ANT_PER_POSITION) {
			antNearPosition = antNearPosition < Math.abs(center - ant) ? antNearPosition
					: Math.abs(center - ant);

			map.put(ant, Math.abs(center - ant));
		}

		Set<Integer> set = map.keySet();
		for (Iterator iterator = set.iterator(); iterator.hasNext();) {
			Integer key = (Integer) iterator.next();
			if (antNearPosition == map.get(key)) {
				antNearCenter = key;
				break;
			}
		}

		return antNearCenter;
	}

	/**
	 * 检查参数的正确性
	 * 
	 * @author yangphere 2009-6-29
	 * @return
	 */
	private static boolean check() {
		if (TOTAL_LENGTH <= 0) {
			return false;
		} else if (ANT_PER_POSITION.size() <= 0) {
			return false;
		}

		// 站在杆外
		for (Integer ant : ANT_PER_POSITION) {

			if (ant <= 0) {
				return false;
			} else if (ant > TOTAL_LENGTH) {
				return false;
			}
		}

		return true;
	}

}

分享到:
评论

相关推荐

    蚂蚁爬杆问题

    蚂蚁爬杆问题 A.B.C三只蚂蚁不同速度在一个杆上爬行,求蚂蚁爬出杆的时间问题

    1蚂蚁爬杆之动态演示

    1. 源代码文件(.java):这些是用Java编写的程序,实现了蚂蚁爬杆的逻辑和动画展示。 2. 类库文件(.jar):可能包含了用于图形渲染和其他功能的外部Java类库。 3. 资源文件(如图片、音频):可能包括蚂蚁和杆子的...

    蚂蚁爬杆问题(面向对象)

    在本案例中,“蚂蚁爬杆问题”是一个典型的OOP应用场景,我们可以用C#语言来实现。下面我们将详细探讨这个问题以及如何用面向对象的方式去解决它。 首先,我们需要定义一个“蚂蚁”类(Ant),这个类至少包含两个...

    c++蚂蚁爬杆问题

    蚂蚁爬杆自己写的,希望大神能够帮助我写代码的质量,有什么问题随便提出来,自己一定会改正的谢谢

    蚂蚁爬杆题目与分析.txt

    通过以上分析和实现,我们可以看到,使用对象的方法来解决“蚂蚁爬杆”这类问题是一种非常有效的方式。它不仅能够清晰地表达问题的关键要素,还能够方便地通过编程语言进行实现。此外,这种解题思路还可以扩展到更多...

    蚂蚁爬杆+图形界面+C#+ide=vs08

    某企业面试编程题:蚂蚁爬杆 有一根300厘米的细木杆,在第30厘米、80厘米、110厘米、160厘米、250厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过两只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会...

    蚂蚁爬杆游戏

    "蚂蚁爬杆游戏"是一款基于C#编程语言开发的小型计算机游戏,其核心玩法是模拟蚂蚁在一根垂直的杆上爬行,目标是计算出所有蚂蚁都安全离开杆子的最短和最长时间。这个游戏涉及到计算机科学中的算法设计、数据结构和...

    蚂蚁爬行问题源码

    《蚂蚁爬行问题的Java实现及其算法解析》 在计算机科学领域,模拟自然界的现象并从中学习解决问题的方法是一种常见的策略。蚂蚁爬行问题就是一个这样的例子,它源于对真实世界蚂蚁行为的观察,然后通过编程来模拟...

    蚂蚁算法解决TSP java实现

    根据给定的信息,本文将详细解析“蚂蚁算法解决TSP问题的Java实现”这一主题。 ### 蚂蚁算法与旅行商问题 #### 一、什么是旅行商问题(TSP) 旅行商问题(Traveling Salesman Problem,简称TSP)是组合优化中的一个...

    algorithm蚂蚁群算法平均Java负载率实现_java

    6. **源码分析**:对于开源的ACO Java实现,可以通过阅读源代码来理解算法的细节,包括蚂蚁的选择策略、信息素的更新规则以及如何结合负载率信息进行调整。这有助于学习和实践优化算法,也可以为其他编程项目提供...

    27厘米的细木杆上蚂蚁爬杆

    6. **异常处理**:在程序中,对于蚂蚁爬出木杆的情况,通过设置`hasRemove`标志来终止蚂蚁的移动,并清空当前位置的蚂蚁。 7. **时间复杂度**:由于每秒蚂蚁只能移动一厘米,且每次移动都会检查是否与其他蚂蚁碰撞...

    蚂蚁爬杆27厘米的细木杆

    有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。 木杆很细,不能同时通过一只蚂蚁。 开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。 当...

    使用C++实现小蚂蚁爬行

    在这个场景中,我们关注的是"使用C++实现小蚂蚁爬行"的问题。这个问题的核心是通过编程语言模拟蚂蚁在一条线上的运动行为,包括它们的相遇和方向变化。让我们深入探讨这个主题。 首先,我们需要理解问题的基本模型...

    蚂蚁3期java架构

    根据提供的信息,“蚂蚁3期java架构”这一主题可能涉及到的是蚂蚁集团内部或相关培训项目中的Java架构设计与实现的相关内容。由于具体的信息较为有限,以下将基于“Java架构”这一核心概念来展开讨论,旨在提供尽...

    PHP实现的蚂蚁爬杆路径算法代码

    在蚂蚁爬杆问题中,目标是找到所有蚂蚁离开杆子的最短和最长时间。 在这个PHP实现的版本中,我们首先定义了一个27厘米的杆子,上有5个位置分别有蚂蚁,蚂蚁只能朝前走或者调头,但不能后退。当两只蚂蚁相遇时,它们...

    java模拟蚂蚁找食物

    在本项目"java模拟蚂蚁找食物"中,我们主要探讨的是如何使用Java编程语言来实现一个简单的模拟系统,以此帮助理解和应用智能算法,尤其是与蚁群算法相关的概念。虽然这个项目并不直接涉及完整的蚁群算法,但它能让...

    最大最小蚂蚁系统实现的旅行商问题(java)

    在Java实现MMAS的过程中,我们需要设计以下几个关键部分: 1. **城市类(City)**:表示旅行商要访问的每个城市,包含城市的位置信息。 2. **路径类(Path)**:存储蚂蚁走过的城市序列,并计算路径长度。 3. **...

    蚁群算法实现vrp问题java版本

    【蚁群算法实现VRP问题Java版本】 ...总之,这个Java实现的蚁群算法为解决VRP提供了一个实用的框架。通过对算法参数的调整和优化,我们可以解决实际物流中的复杂路线规划问题,从而提高运输效率,降低成本。

Global site tag (gtag.js) - Google Analytics