/**

* 蚂蚁类,用于记录蚂蚁的状态及控制蚂蚁行为

*/

public class Ant {

/**

* 蚂蚁爬行方向枚举值

*/

public interface Direction {

/**

* 向左爬行

*/

double LEFT = -1;

/**

* 向右爬行

*/

double RIGHT = 1;

}

/**

* 蚂蚁所在位置,取值范围:[0,1]

*/

private double position;

/**

* 蚂蚁当前爬行的方向

*/

private double direction;

/**

* 蚂蚁爬行速度

*/

private double speed = 1;

/**

* 蚂蚁已爬行的时长

*/

private double crawlingTime;

/**

* 蚂蚁距离下一次碰到其他蚂蚁的时间

*/

private double nextMeetingTime = Double.MAX_VALUE;

/**

* 蚂蚁是否已离开木杆

*/

private boolean left = false;

/**

* 控制蚂蚁调头

*/

public void turnRound() {

this.direction *= -1;

}

/**

* 当蚂蚁不再会跟任何蚂蚁相遇时,控制蚂蚁直接离开木杆

*/

public void leave() {

if (this.direction == Direction.LEFT) {

crawlingTime += position / speed;

} else {

crawlingTime += (1 - position) / speed;

}

nextMeetingTime = Double.MAX_VALUE;

left = true;

}

/**

* 控制蚂蚁爬行一段时间(前提在此段时间内不会和任何蚂蚁相遇)

*

* @param time

* 控制蚂蚁爬行的时间

*/

public void crawling(double time) {

double lastPosition = position;

position += time * speed * direction;

// 若爬行结束时蚂蚁已离开木杆,则将其离开状态刷新为true

if (position < 0 || position > 1) {

left = true;

crawlingTime += (position < 0 ? lastPosition / speed : (lastPosition - 1) / speed);

}

crawlingTime += time;

nextMeetingTime = Double.MAX_VALUE;

}

/**

* 计算和另一只蚂蚁相遇的时间

*

* @param ant

* 另一只蚂蚁

* @return 和另一只蚂蚁相遇的时间

*/

public double timeToMeet(Ant ant) {

if (this.direction * ant.getDirection() > 0) {

return Double.MAX_VALUE;

}

if (this.direction == Direction.LEFT && this.getPosition() <= ant.getPosition()

|| this.direction == Direction.RIGHT && this.getPosition() >= ant.getPosition()) {

return Double.MAX_VALUE;

}

return (this.getPosition() + ant.getPosition() ) * 0.5;

}

public double getCrawlingTime() {

return crawlingTime;

}

public void setCrawlingTime(double crawlingTime) {

this.crawlingTime = crawlingTime;

}

public boolean isLeft() {

return left;

}

public void setLeft(boolean left) {

this.left = left;

}

public double getPosition() {

return position;

}

public void setPosition(double position) {

this.position = position;

}

public double getDirection() {

return direction;

}

public void setDirection(double direction) {

this.direction = direction;

}

public double getSpeed() {

return speed;

}

public void setSpeed(double speed) {

this.speed = speed;

}

public double getNextMeetingTime() {

return nextMeetingTime;

}

public void setNextMeetingTime(double nextMeetingTime) {

this.nextMeetingTime = nextMeetingTime;

}

}

/**

* 主程序

*/

public class Main {

private static Main self;

public static void main(String[] args) {

self = new Main();

int count = 20;

Listants;

double crawlingTime, maxCrawlingTime = 0;

for(int i = 0; i < 1000; i++)

{

ants = new ArrayList();

self.init(ants, count);

// 所有蚂蚁离开木杆的时间

crawlingTime = self.allAntsLeftTime(ants);

maxCrawlingTime = crawlingTime > maxCrawlingTime ? crawlingTime : maxCrawlingTime;

System.out.println("Crawling Time:" + (crawlingTime * 2));

}

System.out.println("Max Crawling Time:" + (maxCrawlingTime * 2));

}

/**

* 计算所有蚂蚁离开木杆的耗时

*

* @param ants 所有蚂蚁

* @return 所有蚂蚁离开木杆的耗时

*/

private double allAntsLeftTime(Listants)

{

double nextMeetingTime;

// 若木杆上的蚂蚁可能相遇,则控制蚂蚁持续爬行,直至不会再出现蚂蚁相遇

while((nextMeetingTime = nextMeeting(ants)) < Double.MAX_VALUE)

{

crawling(ants, nextMeetingTime);

}

double maxCrawlingTime = 0;

Ant ant;

// 遍历蚂蚁在木杆上爬行的时间,获取最大值,即为所有蚂蚁离开木杆的时间

for(int i = 0; i < ants.size(); i++)

{

ant = ants.get(i);

// 若蚂蚁还未离开木杆,控制其离开

if(!ant.isLeft())

{

ant.leave();

}

if( ant.getCrawlingTime() > maxCrawlingTime)

{

maxCrawlingTime = ant.getCrawlingTime();

}

}

return maxCrawlingTime;

}

/**

* 控制所有蚂蚁爬行一段时间(前提:在这个时间段内,所有蚂蚁都不会相遇)

*

* @param ants 所有蚂蚁

* @param time 爬行时间

*/

private void crawling(Listants, double time)

{

Ant ant;

for(int i = 0; i < ants.size(); i++)

{

ant = ants.get(i);

if(ant.isLeft())

{

continue;

}

// 若当前蚂蚁不会再和任何蚂蚁相遇,控制其离开,计算爬行时间

if(ant.getNextMeetingTime() == Double.MAX_VALUE)

{

ant.leave();

continue;

}

ant.crawling(time);

if(ant.getNextMeetingTime() == time)

{

ant.turnRound();

}

}

}

/**

* 计算下一次出现蚂蚁相遇事件的时间

*

* @param ants 所有蚂蚁

* @return 下一次出现蚂蚁相遇事件的时间

*/

private double nextMeeting(Listants) {

Ant ant1, ant2;

double timeToMeet;

// 计算每只蚂蚁与其他蚂蚁相遇的最短时间

// 已离开木杆的蚂蚁不会再和任何蚂蚁相遇

for (int i = 0; i < ants.size(); i++) {

ant1 = ants.get(i);

// 若蚂蚁1已离开木杆,则无需计算

if(ant1.isLeft())

{

continue;

}

// 计算蚂蚁1与其他蚂蚁相遇的最短时间

for (int j = i + 1; j < ants.size(); j++) {

ant2 = ants.get(j);

// 若蚂蚁2已离开木杆,则无需计算

if(ant2.isLeft())

{

continue;

}

timeToMeet = ant1.timeToMeet(ant2);

if (timeToMeet == Double.MAX_VALUE) {

continue;

}

// 若两只蚂蚁可以相遇,且相遇时间短于当前最小时间,则刷新起下次相遇时间

if (ant1.getNextMeetingTime() > timeToMeet) {

ant1.setNextMeetingTime(timeToMeet);

}

if (ant2.getNextMeetingTime() > timeToMeet) {

ant2.setNextMeetingTime(timeToMeet);

}

}

}

// 获取下一次出现蚂蚁相遇的时间点(发生在多久以后)

double nextMeetTime = Double.MAX_VALUE;

for(int i = 0; i < ants.size(); i++)

{

if(ants.get(i).getNextMeetingTime() < nextMeetTime)

{

nextMeetTime = ants.get(i).getNextMeetingTime();

}

}

return nextMeetTime;

}

/**

* 初始化所有蚂蚁的状态

*

* @param ants 蚂蚁对象数组

* @param count 蚂蚁数量

*/

private void init(Listants, int count) {

Ant ant;

for (int i = 0; i < count; i++) {

ant = new Ant();

ant.setPosition(Math.random());

ant.setDirection((Math.random() > 0.5 ? 1 : -1));

ants.add(ant);

}

}

}

蚂蚁爬绳java_腾讯面试题——蚂蚁爬行(Java版)相关推荐

  1. 蚂蚁爬绳问题 java_趣味数学网

    蚂蚁爬绳问题 发布:深蓝 | 发布时间: 2009年4月27日  浏览次数: 一绳长1M,一蚂蚁从绳的一端爬向另一端,速度为每秒1CM,同时,绳子以每秒10CM的速度均匀伸长,问:蚂蚁能否达到绳的另一 ...

  2. 蚂蚁爬杆问题php,PHP实现的蚂蚁爬杆路径算法代码_php技巧

    $i) { // 超出计算范围 return $directionArr; } if(0 == $directionArr[$i]) { // 当前位加1 $directionArr[$i] = 1; ...

  3. java 算法笔试题_【干货】经典算法面试题代码实现-Java版

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 面试题3:二维数组中的查找 题目描述:一个二维数组,每一行从左到右递增,每一列从上到下递增.输入一个二维数组和一个整数,判断数组中是否含有整数. publ ...

  4. java算法面试题_【干货】经典算法面试题代码实现-Java版

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 面试题3:二维数组中的查找 题目描述:一个二维数组,每一行从左到右递增,每一列从上到下递增.输入一个二维数组和一个整数,判断数组中是否含有整数. publ ...

  5. java 打印_剑指Offer面试题20(Java版):顺时针打印矩阵

    题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字.例如:如果输入如下矩阵: 1,2,3,4 5,6,7,8 9,10,11,12 13,14,15,16 则依次打印出数字1,2,3, ...

  6. 剑指Offer面试题22(Java版):栈的压入、弹出序列

    题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序. 假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压栈序列,序列,4,5,3,2,1是该压栈序 ...

  7. 随机红包 java_微信随机生成红包金额算法java版

    最近几年玩得最疯狂的应该是发红包了,尤其是过年的时候特别受欢迎,下面写了红包的随机算法,其实挺简单的,仅是提供一种思路,希望可以给大家一些启发. public class WxAlgorithm{ / ...

  8. 无情剑梦断危情java_无情剑梦断危情java版下载-无情剑梦断危情最新版下载v1.1.0 安卓版 - 星光下载...

    无情剑梦断危情最新版是无情剑系列的另外一精品游戏,游戏用小巧的画面和丰富的故事讲述了一个热血江湖世界,玩家控制主角经历无数次战斗,最终成长为一代大侠英雄. 无情剑梦断危情java版介绍 精美的游戏场景 ...

  9. 链表就地逆置Java_单链表就地逆置(Java版)

    题目:有一个线性表(a1,a2,a3,...,an),采用带头节点的单链表L存储,设计一个算法将其就地逆置,线性表变为(an,...a3,a2,a1).所谓"就地"指辅助存储空间为 ...

最新文章

  1. 例题3-4 猜数字游戏的提示(Master-Mind Hints, UVa 340)
  2. wordpress中文乱码处理方法
  3. Kinect for windows的重力感应和角度马达
  4. 神剑仙缘java_异界修真-神剑仙缘
  5. Laravel核心解读--Cookie源码分析
  6. 苹果正开发更轻薄MacBook Air 且配备MagSafe
  7. 苹果Mac矢量图形设计工具:Affinity Designer Beta
  8. android+流量防火墙,流量防火墙APP
  9. Unity编辑器开发之中文名称转拼音
  10. 微信小程序之WeUI组件库的使用
  11. 学习方法——TRIZ创新理论中的八大法则
  12. 零基础Python学习(2) --- 《我想你猜》1.0版
  13. 英语听力采用计算机化考试,高考英语复习资料及听力机考特点与应对建议
  14. C语言读写SQLite数据库
  15. Windos 前后端项目的部署
  16. GNU GRUB磁盘分区后不能引导启动---修复启动
  17. 关于数据仓库面试题的整理
  18. Delphi7 To Delphi XE的变化
  19. ios 隐私政策网址(URL)
  20. [bzoj4833][数论][min-max容斥]最小公倍佩尔数

热门文章

  1. Visio画图-visio 2007中的布局与排列间距在哪里
  2. python 北京出租车收费3.45_python进阶(三)
  3. 数据结构实验一,第2题:基于顺序存储结构的图书信息表的排序
  4. 用java实现计算器
  5. 【数据编制架构】什么是数据编织(Data fabric)? 完整指南
  6. 模型评估指标 AUC 和 ROC,这是我看到的最透彻的讲解
  7. 一行python能做什么!
  8. linux服务器设置jar包开机自启动
  9. 一位从事量化交易的实战者,手把手带你入门量化交易!
  10. 人工智能和机器学习在改善客户体验方面的应用