`
kim
  • 浏览: 152624 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

[转]5只蚂蚁的问题

阅读更多

题目:有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过一只蚂蚁。开 始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走 一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。

模拟每秒钟5只蚂蚁的情况。在生成Ant对象时确定蚂蚁的运行方向和名字。代码如下:

public class Ant {
//蚂蚁的位置
private int position;
//爬行方向
private boolean front_flg;
//是否到达终点
private boolean isOver = false;
//蚂蚁的名字
private String antName;
public boolean isOver() {
if((position == 0)||(position == 27)){
isOver = true;
} else {
isOver = false;
}
return isOver;
}
public void setOver(boolean isOver) {
this.isOver = isOver;
}
public String getAntName() {
return antName;
}
public void setAntName(String antName) {
this.antName = antName;
}
public boolean isFront_flg() {
return front_flg;
}
public void setFront_flg(boolean front_flg) {
this.front_flg = front_flg;
}
public void setPosition(int position) {
this.position = position;
}
//构造方法
public Ant (int position,boolean flg,String antName){
this.position = position;
this.front_flg = flg;
this.antName = antName;
}
public void crawl(boolean front_flg){
//根据爬行方向判断position的加减
if(!(isOver())){
if (front_flg){
position = position + 1;
} else {
position = position - 1;
}
}
System.out.println(antName + " has arrived position : " + position);
}
public int getPosition() {
return position;
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Ant ant3 = new Ant (3,true,"ant3");
Ant ant7 = new Ant (7,true,"ant7");
Ant ant11 = new Ant (11,true,"ant11");
Ant ant17 = new Ant (17,false,"ant17");
Ant ant23 = new Ant (23,false,"ant23");
//记录爬行时间
int useTime = 1;
while(!(ant3.isOver()
&&ant7.isOver()
&&ant11.isOver()
&&ant17.isOver()
&&ant23.isOver())){

//如果两只蚂蚁相遇则调转爬行方向
if (ant3.getPosition()==ant7.getPosition()){
boolean temp;
temp = ant3.isFront_flg();
ant3.setFront_flg(ant7.isFront_flg());
ant7.setFront_flg(temp);
}
if (ant3.getPosition()==ant11.getPosition()){
boolean temp;
temp = ant3.isFront_flg();
ant3.setFront_flg(ant11.isFront_flg());
ant11.setFront_flg(temp);
}
if (ant3.getPosition()==ant17.getPosition()){
boolean temp;
temp = ant3.isFront_flg();
ant3.setFront_flg(ant17.isFront_flg());
ant17.setFront_flg(temp);
}
if (ant3.getPosition()==ant23.getPosition()){
boolean temp;
temp = ant3.isFront_flg();
ant3.setFront_flg(ant23.isFront_flg());
ant23.setFront_flg(temp);
}

if (ant7.getPosition()==ant11.getPosition()){
boolean temp;
temp = ant7.isFront_flg();
ant7.setFront_flg(ant11.isFront_flg());
ant11.setFront_flg(temp);
}
if (ant7.getPosition()==ant17.getPosition()){
boolean temp;
temp = ant7.isFront_flg();
ant7.setFront_flg(ant17.isFront_flg());
ant17.setFront_flg(temp);
}
if (ant7.getPosition()==ant23.getPosition()){
boolean temp;
temp = ant7.isFront_flg();
ant7.setFront_flg(ant23.isFront_flg());
ant23.setFront_flg(temp);
}

if (ant11.getPosition()==ant17.getPosition()){
boolean temp;
temp = ant11.isFront_flg();
ant11.setFront_flg(ant17.isFront_flg());
ant17.setFront_flg(temp);
}
if (ant11.getPosition()==ant23.getPosition()){
boolean temp;
temp = ant11.isFront_flg();
ant11.setFront_flg(ant23.isFront_flg());
ant23.setFront_flg(temp);
}

if (ant17.getPosition()==ant23.getPosition()){
boolean temp;
temp = ant17.isFront_flg();
ant17.setFront_flg(ant23.isFront_flg());
ant23.setFront_flg(temp);
}
//蚂蚁爬行
ant3.crawl(ant3.isFront_flg());
ant7.crawl(ant7.isFront_flg());
ant11.crawl(ant11.isFront_flg());
ant17.crawl(ant17.isFront_flg());
ant23.crawl(ant23.isFront_flg());
System.out.println("Use time is :" + useTime++);
System.out.println("================================");
}
}
}
分享到:
评论
3 楼 windows1987 2010-01-05  
今天我在一本叫做《编程之美-微软技术面试心得》这本书上看到了这道题的解法,建议楼主看一下,相当的简单,相当的有启发,呵呵!
2 楼 gainfirst 2009-06-25  
我的思路是定义了一个木头类和蚂蚁类,蚂蚁碰头掉转方向的依据是当前蚂蚁所在木头上的位置蚂蚁的数量是否是等于2,如果是掉头,就是这一点不一样,其他差不多。
1 楼 gainfirst 2009-06-25  
   很有意思,我自己也写了个,写完后看了下你的实现思路算是差不多,不一样的地方就是我的蚂蚁在有限的长度内的位置和方向可以随便改动。我的疑问是如果把这个问题进行扩展,如何定义一种好的数据结构能都将木头的长度,蚂蚁的位置和数量表达的情况。里面有个问题就是如果是这种好的结构是存在,那么在初始化蚂蚁的位置和方向的时候,如何去检验这个是正确的。比如:
      A在3,B在4,A向右爬,B向左爬,此时这个位置错误的 这种情况还好说
      A在3,B在4,C在5,A-R,B-R,C-R 正确,但是这个里面如果C-L,那么这个是错误的

    当然还有很多复杂的情况可以假设,如果蚂蚁的数量很多,情况就会很复杂,我就在想这里面有没有很好的初始化校验的方法,一直在想,却不得其解。本来是写着玩的,但是脑一闲下来的时候就会忍不住就想,哎  

相关推荐

    阿里面试 - 蚂蚁金服前端面试题

    大厂面试题,岗位前端开发工程师,阿里旗下,蚂蚁金服,一面原题,共5道在线编程题,不含答案!仅供参考学习!涉及防抖、进制转换、模板引擎、事件订阅、数组转换等。

    蚂蚁-前端-笔试题.js

    原生js操作:驼峰格式和下划线格式互转,json字符串转换……五道题,带答案

    langtons-ant:用p5.js制作的兰顿蚂蚁–

    兰顿蚂蚁 兰顿的蚂蚁是一台二维图灵机,具有一组非常简单的规则,但复杂的紧急行为。 它是由克里斯·兰顿(Chris Langton)于1986年发明的,它在黑白单元格的方形格子上运行。 我推荐Numberphile的来更好地解释它。...

    蚂蚁分类信息系统

    增加手机信息页以及商家页分享微信分享朋友圈的功能7,信息分类列表页的标题改进8,修正手机版里输入框检测重复时,窗口不停弹出无法关闭的BUG9,修正违禁词语出现后信息不自动转待审的问题10,增加手机端找回用户...

    大厂真题之蚂蚁金服-资深工程师

    红黑书:红黑树是在普通二叉树上,对每个节点添加一个颜色属性形成的,需要 同时满足一下五条性质 (1)节点是红色或者是黑色; (2)根节点是黑色; (3)每个叶节点(NIL 或空节点)是黑色; (4)每个红色节点的...

    普通字符转MD5编码

    将输入的字符进行某种方式的编码后显示出来!

    php最新威客任务平台源码修复版 PHP手机任务平台源码 支持投票,个人免签码支付 图片文字安装说明【2019最新版】

    微信/支付宝即时到账,几千元的资源,类似蚂蚁帮扶、众人帮平台。 1.二维码推广海报功能 2.增加注册账号短信验证码功能(对接阿里云短信) 3.支付接口更换为个人免签约支付(不需要企业开户) 4.修复个人中心Q群连接...

    GOPS大会2019相关PPT集锦11则

    2、长路漫漫踏歌而行:蚂蚁金服Service+Mesh实践探索 3、百度智能云容器产品布局和创新应用 4、华泰保险核心业务系统容器化之路 5、中国人寿如何基于容器构建PaaS云平台 6、反脆弱:云计算时代运维如何转型-中国银行...

    Scratch儿童编程培训资料-7.pptx

    精彩案例分析与实现: 视频演示: 小猫躲移动挡板 蚂蚁爬线 案例讲解流程和实操 第一讲 Scratch编程(1) Scratch儿童编程培训资料-7全文共17页,当前为第2页。 案例讲解流程 1、任务导航 2、任务分析 3、跟着做 4...

    twu-biblioteca-rajatg:TWU面条书目分配

    如果要使用Ant Build Tool编译项目,只需使用shell转到项目目录并在shell中执行以下命令: $ ant compile 如何运行JUnit测试 如果要运行JUnit测试,只需使用shell转到项目目录并在shell中执行以下命令: $ ant ...

    LM3914工作原理及电路接线的应用

    10级电压比较器的同相输入端与电阻分压器相连,电阻分压器由10只1kg精密电阻串联组成。 各单位级比较器的加权值相等,从而使得十级线性显示驱动器的组成,适合与LED中使用,更能完成LCD、VFD电平表的线性标度器件的...

    2022年支付宝私域运营白皮书.pdf

    目录:一、支付宝商家私域运营趋势 04二、支付宝私域运营全链路地图 10三、如何在支付宝做生活号运营 52四、如何在支付宝运营会员 72五、如何在支付宝玩转优惠券 85六、支付宝私域运营激励政策 94七、蚂蚁特色能力...

    AI + : 2016 人工智能影响力微报告.pdf

    今年年初的Apple的Siri,亚马逊的Echo和Alexa,阿里巴巴的ET和阿里小蜜,蚂蚁金服的刷脸支付,Google的无人车等都有人工智能技术的身影。投资界和产业界对AI的关注度更是前所未有的高涨,令人联想起2000年左右互联网...

    javalruleetcode-Exercises:Leetcode、Hackerrank等

    二进制转字符串 翻转位取胜 下一个号码 调试器 转换 成对交换 画线 6) 数学和逻辑谜题: 重药丸 篮球 多米诺骨牌 三角形上的蚂蚁 一壶水 蓝眼岛 天启 掉蛋问题 100个储物柜 毒 7) 面向对象设计: 一副纸牌 呼叫中心 ...

    【混合K-Means蚁群算法】混合K-Means蚁群算法求解CVRP问题附Matlab完整代码

    步骤5:判断新聚类中心坐标与原聚类中心坐标的差值是否大于设定的阈值,若大于,则转至步骤2;否则,保存聚类结果,改进K-Means聚类算法结束。 阶段2:配送路径规划 经过阶段1的聚类后,每个聚类簇内的需求点需求量...

    Visual C++网络通信编程实用案例精选 配套源码

    1.光盘的运行环境 硬件环境:CPU的主频在200...类似网络蚂蚁的断点续传程序【\Appendix\NetAnts】 网络多播程序【\Appendix\BroadCast】 界面美观的文字聊天程序【\Appendix\Chat】 语音电话【\Appendix\PhoneCall】

    Visual+C++网络通信编程实用案例.rar

    1.光盘的运行环境 硬件环境:CPU的主频在200...类似网络蚂蚁的断点续传程序【\Appendix\NetAnts】 网络多播程序【\Appendix\BroadCast】 界面美观的文字聊天程序【\Appendix\Chat】 语音电话【\Appendix\PhoneCall】

    原型设计,axure9最全组件库

    5.在设备模型中提供了iOS、Android等8种主流的设备线框模型,所有的模型元素都支持调整尺寸和颜色,可用于制作线框或手绘原型图。另外,作品中还提供了绘制流程图的各种风格的元素及线条,以及交互原型标注的标签和...

    大量VC++通信开发实例,全部源码

    基本网络编程实例 Winsock实现网络聊天室【\...类似网络蚂蚁的断点续传程序【\Appendix\NetAnts】 网络多播程序【\Appendix\BroadCast】 界面美观的文字聊天程序【\Appendix\Chat】 语音电话【\Appendix\PhoneCall】

    VC++网络通信实例教程

    光 盘 说 明 为了方便读者学习,本书附带了...类似网络蚂蚁的断点续传程序【\Appendix\NetAnts】 网络多播程序【\Appendix\BroadCast】 界面美观的文字聊天程序【\Appendix\Chat】 语音电话【\Appendix\PhoneCall】

Global site tag (gtag.js) - Google Analytics