蚂蚁爬绳java_腾讯面试题——蚂蚁爬行(Java版)
/**
* 蚂蚁类,用于记录蚂蚁的状态及控制蚂蚁行为
*/
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版)相关推荐
- 蚂蚁爬绳问题 java_趣味数学网
蚂蚁爬绳问题 发布:深蓝 | 发布时间: 2009年4月27日 浏览次数: 一绳长1M,一蚂蚁从绳的一端爬向另一端,速度为每秒1CM,同时,绳子以每秒10CM的速度均匀伸长,问:蚂蚁能否达到绳的另一 ...
- 蚂蚁爬杆问题php,PHP实现的蚂蚁爬杆路径算法代码_php技巧
$i) { // 超出计算范围 return $directionArr; } if(0 == $directionArr[$i]) { // 当前位加1 $directionArr[$i] = 1; ...
- java 算法笔试题_【干货】经典算法面试题代码实现-Java版
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 面试题3:二维数组中的查找 题目描述:一个二维数组,每一行从左到右递增,每一列从上到下递增.输入一个二维数组和一个整数,判断数组中是否含有整数. publ ...
- java算法面试题_【干货】经典算法面试题代码实现-Java版
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 面试题3:二维数组中的查找 题目描述:一个二维数组,每一行从左到右递增,每一列从上到下递增.输入一个二维数组和一个整数,判断数组中是否含有整数. publ ...
- java 打印_剑指Offer面试题20(Java版):顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字.例如:如果输入如下矩阵: 1,2,3,4 5,6,7,8 9,10,11,12 13,14,15,16 则依次打印出数字1,2,3, ...
- 剑指Offer面试题22(Java版):栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序. 假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压栈序列,序列,4,5,3,2,1是该压栈序 ...
- 随机红包 java_微信随机生成红包金额算法java版
最近几年玩得最疯狂的应该是发红包了,尤其是过年的时候特别受欢迎,下面写了红包的随机算法,其实挺简单的,仅是提供一种思路,希望可以给大家一些启发. public class WxAlgorithm{ / ...
- 无情剑梦断危情java_无情剑梦断危情java版下载-无情剑梦断危情最新版下载v1.1.0 安卓版 - 星光下载...
无情剑梦断危情最新版是无情剑系列的另外一精品游戏,游戏用小巧的画面和丰富的故事讲述了一个热血江湖世界,玩家控制主角经历无数次战斗,最终成长为一代大侠英雄. 无情剑梦断危情java版介绍 精美的游戏场景 ...
- 链表就地逆置Java_单链表就地逆置(Java版)
题目:有一个线性表(a1,a2,a3,...,an),采用带头节点的单链表L存储,设计一个算法将其就地逆置,线性表变为(an,...a3,a2,a1).所谓"就地"指辅助存储空间为 ...
最新文章
- 例题3-4 猜数字游戏的提示(Master-Mind Hints, UVa 340)
- wordpress中文乱码处理方法
- Kinect for windows的重力感应和角度马达
- 神剑仙缘java_异界修真-神剑仙缘
- Laravel核心解读--Cookie源码分析
- 苹果正开发更轻薄MacBook Air 且配备MagSafe
- 苹果Mac矢量图形设计工具:Affinity Designer Beta
- android+流量防火墙,流量防火墙APP
- Unity编辑器开发之中文名称转拼音
- 微信小程序之WeUI组件库的使用
- 学习方法——TRIZ创新理论中的八大法则
- 零基础Python学习(2) --- 《我想你猜》1.0版
- 英语听力采用计算机化考试,高考英语复习资料及听力机考特点与应对建议
- C语言读写SQLite数据库
- Windos 前后端项目的部署
- GNU GRUB磁盘分区后不能引导启动---修复启动
- 关于数据仓库面试题的整理
- Delphi7 To Delphi XE的变化
- ios 隐私政策网址(URL)
- [bzoj4833][数论][min-max容斥]最小公倍佩尔数