前几天,我参加某公司的笔试,遇到如下题目
一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。 木杆很细,不能同时通过一只蚂蚁。开始 时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。 编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。
当时急急忙忙写了一下,写得不是很完整,现在重新写下,和大家分享
import java.util.*;
public class MaYi
{
public final static int FORWARD = 1;//向前走
public final static int BACKWARD = -1;//向后走
public int location;//位置
public int direction;//方向
public MaYi()
{
this.location =0;
this.direction =FORWARD;
}
public MaYi(int location ,int direction)
{
this.location = location;
this.direction = direction;
}
/**
* 蚂蚁移动
*/
public void walk()
{
location += direction;
}
/**
* 蚂蚁掉转方向
*/
public void turn()
{
if(direction == FORWARD) direction = BACKWARD;
else direction = FORWARD;
}
/**
*两只蚂蚁是否碰头
*/
public boolean isNear(MaYi m)
{ if(m ==null) return false;
int result = this.location - m.location;
if(result ==1 || result== -1) return true;
else return false;
}
/**
*蚂蚁是否离开
*/
public boolean isLeave()
{
if(location<1 || location >27) return true;
else return false;
}
public static void run(List<MaYi> list)
{ //总的次数
int count = 0;
//循环,直到所有蚂蚁都离开
while(!list.isEmpty())
{
MaYi first =null;
MaYi second = null;
for(int i = 0; i<list.size();i++)
{
first = list.get(i);
//如果蚂蚁是最后一只,则它的前面没有任何蚂蚁
//如果不是最后一只,则它的前面有蚂蚁
//参考系为蚂蚁的前进方向
if(first.direction == FORWARD) {
if(i+1 ==list.size()) second = null;
else second = list.get(i+1);
}
else if(first.direction == BACKWARD)
{
if( i== 0 ) second =null;
else second = list.get(i-1);
}
//如果两支蚂蚁碰头,则调转方向
if(first.isNear(second))
{
first.turn();
second.turn();
}
//前进
first.walk();
//如果蚂蚁走到了尽头
if(first.isLeave()) list.remove(first);
}
count++;//计算次数
}
System.out.println(" 移动时间为:"+count);
System.out.println();
}
public static void main(String[] args)
{
int first ,second,third,fourth,fifth;
List<MaYi> list = null;
for(int a=0;a<2;a++)
for(int b=0;b<2;b++)
for(int c=0;c<2;c++)
for(int d=0;d<2;d++)
for(int e=0;e<2;e++)
{
if(a ==0) first =1;
else first = -1;
if(b ==0) second =1;
else second = -1;
if(c ==0) third =1;
else third = -1;
if(d ==0) fourth =1;
else fourth = -1;
if(e ==0) fifth =1;
else fifth = -1;
list= new LinkedList<MaYi>();
list.add(new MaYi(3,first));
list.add(new MaYi(7,second));
list.add(new MaYi(11,third));
list.add(new MaYi(17,fourth));
list.add(new MaYi(23,fifth));
System.out.printf("第1蚂蚁,位置3,方向%d\n",first);
System.out.printf("第2蚂蚁,位置7,方向%d\n",second);
System.out.printf("第3蚂蚁,位置11,方向%d\n",third);
System.out.printf("第4蚂蚁,位置17,方向%d\n",fourth);
System.out.printf("第5蚂蚁,位置23,方向%d\n",fifth);
MaYi.run(list);
}
}
}
结果如下:
第1蚂蚁,位置3,方向1
第2蚂蚁,位置7,方向1
第3蚂蚁,位置11,方向1
第4蚂蚁,位置17,方向1
第5蚂蚁,位置23,方向1
移动时间为:25
第1蚂蚁,位置3,方向1
第2蚂蚁,位置7,方向1
第3蚂蚁,位置11,方向1
第4蚂蚁,位置17,方向1
第5蚂蚁,位置23,方向-1
移动时间为:24
第1蚂蚁,位置3,方向1
第2蚂蚁,位置7,方向1
第3蚂蚁,位置11,方向1
第4蚂蚁,位置17,方向-1
第5蚂蚁,位置23,方向1
移动时间为:24
第1蚂蚁,位置3,方向1
第2蚂蚁,位置7,方向1
第3蚂蚁,位置11,方向1
第4蚂蚁,位置17,方向-1
第5蚂蚁,位置23,方向-1
移动时间为:24
第1蚂蚁,位置3,方向1
第2蚂蚁,位置7,方向1
第3蚂蚁,位置11,方向-1
第4蚂蚁,位置17,方向1
第5蚂蚁,位置23,方向1
移动时间为:24
第1蚂蚁,位置3,方向1
第2蚂蚁,位置7,方向1
第3蚂蚁,位置11,方向-1
第4蚂蚁,位置17,方向1
第5蚂蚁,位置23,方向-1
移动时间为:24
第1蚂蚁,位置3,方向1
第2蚂蚁,位置7,方向1
第3蚂蚁,位置11,方向-1
第4蚂蚁,位置17,方向-1
第5蚂蚁,位置23,方向1
移动时间为:22
第1蚂蚁,位置3,方向1
第2蚂蚁,位置7,方向1
第3蚂蚁,位置11,方向-1
第4蚂蚁,位置17,方向-1
第5蚂蚁,位置23,方向-1
移动时间为:24
第1蚂蚁,位置3,方向1
第2蚂蚁,位置7,方向-1
第3蚂蚁,位置11,方向1
第4蚂蚁,位置17,方向1
第5蚂蚁,位置23,方向1
移动时间为:24
第1蚂蚁,位置3,方向1
第2蚂蚁,位置7,方向-1
第3蚂蚁,位置11,方向1
第4蚂蚁,位置17,方向1
第5蚂蚁,位置23,方向-1
移动时间为:24
第1蚂蚁,位置3,方向1
第2蚂蚁,位置7,方向-1
第3蚂蚁,位置11,方向1
第4蚂蚁,位置17,方向-1
第5蚂蚁,位置23,方向1
移动时间为:22
第1蚂蚁,位置3,方向1
第2蚂蚁,位置7,方向-1
第3蚂蚁,位置11,方向1
第4蚂蚁,位置17,方向-1
第5蚂蚁,位置23,方向-1
移动时间为:24
第1蚂蚁,位置3,方向1
第2蚂蚁,位置7,方向-1
第3蚂蚁,位置11,方向-1
第4蚂蚁,位置17,方向1
第5蚂蚁,位置23,方向1
移动时间为:22
第1蚂蚁,位置3,方向1
第2蚂蚁,位置7,方向-1
第3蚂蚁,位置11,方向-1
第4蚂蚁,位置17,方向1
第5蚂蚁,位置23,方向-1
移动时间为:24
第1蚂蚁,位置3,方向1
第2蚂蚁,位置7,方向-1
第3蚂蚁,位置11,方向-1
第4蚂蚁,位置17,方向-1
第5蚂蚁,位置23,方向1
移动时间为:20
第1蚂蚁,位置3,方向1
第2蚂蚁,位置7,方向-1
第3蚂蚁,位置11,方向-1
第4蚂蚁,位置17,方向-1
第5蚂蚁,位置23,方向-1
移动时间为:24
第1蚂蚁,位置3,方向-1
第2蚂蚁,位置7,方向1
第3蚂蚁,位置11,方向1
第4蚂蚁,位置17,方向1
第5蚂蚁,位置23,方向1
移动时间为:22
第1蚂蚁,位置3,方向-1
第2蚂蚁,位置7,方向1
第3蚂蚁,位置11,方向1
第4蚂蚁,位置17,方向1
第5蚂蚁,位置23,方向-1
移动时间为:22
第1蚂蚁,位置3,方向-1
第2蚂蚁,位置7,方向1
第3蚂蚁,位置11,方向1
第4蚂蚁,位置17,方向-1
第5蚂蚁,位置23,方向1
移动时间为:22
第1蚂蚁,位置3,方向-1
第2蚂蚁,位置7,方向1
第3蚂蚁,位置11,方向1
第4蚂蚁,位置17,方向-1
第5蚂蚁,位置23,方向-1
移动时间为:24
第1蚂蚁,位置3,方向-1
第2蚂蚁,位置7,方向1
第3蚂蚁,位置11,方向-1
第4蚂蚁,位置17,方向1
第5蚂蚁,位置23,方向1
移动时间为:20
第1蚂蚁,位置3,方向-1
第2蚂蚁,位置7,方向1
第3蚂蚁,位置11,方向-1
第4蚂蚁,位置17,方向1
第5蚂蚁,位置23,方向-1
移动时间为:24
第1蚂蚁,位置3,方向-1
第2蚂蚁,位置7,方向1
第3蚂蚁,位置11,方向-1
第4蚂蚁,位置17,方向-1
第5蚂蚁,位置23,方向1
移动时间为:18
第1蚂蚁,位置3,方向-1
第2蚂蚁,位置7,方向1
第3蚂蚁,位置11,方向-1
第4蚂蚁,位置17,方向-1
第5蚂蚁,位置23,方向-1
移动时间为:24
第1蚂蚁,位置3,方向-1
第2蚂蚁,位置7,方向-1
第3蚂蚁,位置11,方向1
第4蚂蚁,位置17,方向1
第5蚂蚁,位置23,方向1
移动时间为:18
第1蚂蚁,位置3,方向-1
第2蚂蚁,位置7,方向-1
第3蚂蚁,位置11,方向1
第4蚂蚁,位置17,方向1
第5蚂蚁,位置23,方向-1
移动时间为:24
第1蚂蚁,位置3,方向-1
第2蚂蚁,位置7,方向-1
第3蚂蚁,位置11,方向1
第4蚂蚁,位置17,方向-1
第5蚂蚁,位置23,方向1
移动时间为:18
第1蚂蚁,位置3,方向-1
第2蚂蚁,位置7,方向-1
第3蚂蚁,位置11,方向1
第4蚂蚁,位置17,方向-1
第5蚂蚁,位置23,方向-1
移动时间为:24
第1蚂蚁,位置3,方向-1
第2蚂蚁,位置7,方向-1
第3蚂蚁,位置11,方向-1
第4蚂蚁,位置17,方向1
第5蚂蚁,位置23,方向1
移动时间为:12
第1蚂蚁,位置3,方向-1
第2蚂蚁,位置7,方向-1
第3蚂蚁,位置11,方向-1
第4蚂蚁,位置17,方向1
第5蚂蚁,位置23,方向-1
移动时间为:24
第1蚂蚁,位置3,方向-1
第2蚂蚁,位置7,方向-1
第3蚂蚁,位置11,方向-1
第4蚂蚁,位置17,方向-1
第5蚂蚁,位置23,方向1
移动时间为:18
第1蚂蚁,位置3,方向-1
第2蚂蚁,位置7,方向-1
第3蚂蚁,位置11,方向-1
第4蚂蚁,位置17,方向-1
第5蚂蚁,位置23,方向-1
移动时间为:24
分享到:
相关推荐
### 百度技术研发笔试题目解析:蚂蚁行走问题 #### 题目背景与目标 本题目来源于百度的技术研发笔试,旨在考察应聘者对于算法设计、数据结构应用以及编程能力的理解和掌握程度。题目以五只蚂蚁在一个细长的木杆上...
《蚂蚁金服上机题目与解答》 在IT行业中,面试是评估候选者技术能力的重要环节,特别是对于大型科技公司如蚂蚁金服来说,其面试流程通常包括技术面试、算法测试以及上机编程等环节。这个名为“蚂蚁金服上机题目和...
蚂蚁金服社招java笔试题目编码面试学习指南 该存储库包含我为准备编码面试而收集的笔记。 这些笔记基于流行的书籍:和。 第 1 章:数组和字符串 笔记哈希表:一种将键映射到值以实现高效查找的数据结构。 ArrayLists...
整理了一下阿里巴巴往届笔试面试题,希望对大家有帮助: 来源:阿里巴巴笔试面试圈>> 1、史上最全Java面试266题:算法+缓存+TCP+JVM+搜索+分布式+数据库 ...9、2016校招阿里巴巴C++工程师笔试题目
### 西安交大龙山软件笔试题目解析 #### 数据库查询优化问题 **题目描述:** 一家税务公司在每月月底需要向客户出具税务情况报告。在这个过程中,需要用到13个查询语句和一个存储过程来获取所需数据。这种方式不仅...
通过这些知识点,可以推断出这道笔试题可能是蚂蚁金服在选拔算法工程师时的题目,旨在考察应聘者对字符串操作的熟练程度以及递归思维的掌握情况。对于应聘者而言,要解决这类问题,需要具备良好的编程基础和算法分析...
2020阿里巴巴-反洗钱专员(测试题)
1. **问题建模**:题目描述了一个典型的同步问题,即多线程(在这里是多蚂蚁)在有限空间(木杆)内的移动问题。蚂蚁在特定位置相遇时会改变方向,最终目标是让所有蚂蚁离开木杆。这个问题可以转化为一个状态机模型...
1. **问题建模**:题目描述了一个典型的多线程并发问题,将蚂蚁行走的过程类比为线程同步。每只蚂蚁代表一个线程,它们在木杆上的位置代表线程的状态,蚂蚁的行走方向代表线程执行的方向。 2. **算法设计**: - **...
蚂蚁金服机试题分享-附件资源
【百度历年笔试试题汇总】是一份集合了百度公司历年技术类笔试题目的资源,涵盖了算法、数据结构等多个核心IT领域。这些题目旨在测试应聘者的编程能力、逻辑思维以及对计算机科学基础知识的理解。 1. **数据库通知...
"500强笔试思维逻辑题" 这组题目涵盖了逻辑思维、数学、推理和智慧等多个方面,旨在考察考生的逻辑思维能力、分析能力和解决问题的能力。本次我们将对每道题进行详细的分析和解释。 【1】假设有一个池塘,里面有...
模块说明com.ace.explore.ant.lock:题目一,自旋锁com.ace.explore.ant.statistics:题目二,java代码、注释统计com.ace.explore.ant.collection:题目三,queue&stackcom.ace.explore.ant.streaming:选做题,入口...
### 百度历年笔试面试150题知识点详解 #### 1. C语言实现字符串倒序函数 **知识点概述:** 本题考察的是基础的字符串操作能力,要求使用C语言编写一个函数`revert`来实现字符串的原地倒序。 **实现思路:** 1. **...
在百度的技术研发笔试中,出现了一道与蚂蚁移动相关的题目。题目描述了在一个27厘米长的细木杆上,分别在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上放置了五只蚂蚁。这些蚂蚁只能向前走或调头,并且在相遇...
3. **算法与模拟**:蚂蚁行走问题是一个典型的逻辑和算法问题,需要编写程序来模拟蚂蚁的行为,计算最少和最多的时间。这涉及到条件判断、循环和基本的数据结构。 4. **数组操作**:将数组中的奇数移动到左边,偶数...
5. **百度技术研发笔试题解析**:此题目的核心是模拟蚂蚁行走并解决相遇问题。蚂蚁只能在整数厘米的位置相遇,每次移动1厘米,相遇时会调头。程序设计涉及数据结构(如数组)和算法(如遍历、状态转移)。 6. **...
下面将逐一解析这些题目所涵盖的Java面试知识点。 1. **C语言实现字符串倒序**:这道题虽然不是Java,但它涉及到字符串操作,这是Java程序员应该理解的基础。在Java中,可以使用StringBuilder或StringBuffer类的...