最近在网上看到一个蚂蚁爬杆的笔试题,很多人写出来答案公布出来了,但是都不是很满意,下面是我自己写的,大家参考
题目:有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Mayi {
public static final int MAX_LENGTH = 27;
public static int[] list = {3,7,11,17,23};
/**
* @param args
*/
public static void main(String[] args) {
int[][] direct = getDirect(5);
List<Integer> result = new ArrayList<Integer>();
for(int i=0;i<direct.length;i++){
int[] start = new int[list.length];
System.arraycopy(list, 0, start, 0, list.length);
int time = move(start,direct[i],0);
result.add(time);
}
System.out.println("max time:"+Collections.max(result));
System.out.println("min time:"+Collections.min(result));
}
/**
* 递归生成方向数组
* @param n
* @return
*/
public static int[][] getDirect(int n){
if(n==1){
return new int[][]{{1},{-1}};
}
int[][] last = getDirect(n-1);
int[][] result = new int[last.length*2][n];
for(int k=0;k<last.length;k++){
result[k][0]=1;
for(int j=0;j<n-1;j++){
result[k][j+1]=last[k][j];
}
}
for(int k=0;k<last.length;k++){
result[k+last.length][0]=-1;
for(int j=0;j<n-1;j++){
result[k+last.length][j+1]=last[k][j];
}
}
return result;
}
/**
* 按照规定的起始方向走完需要的总时间
* @param list
* @param direct
* @param sum
* @return
*/
public static int move(int[] list,int[] direct,int sum){
int tmp = -1;
int distance = MAX_LENGTH;
//查看是否可能会出现碰撞
for(int i=0;i<direct.length-1;i++){
if(direct[i]==1&&direct[i+1]==-1){
if(list[i+1]-list[i]<=distance){
distance = list[i+1]-list[i];
tmp = i;
}
}
}
//如果有碰撞,递归进行下一步
if(tmp!=-1){
int time = distance/2;
for(int i=0;i<list.length;i++){
list[i] = list[i]+direct[i]*time;
}
direct[tmp]=-direct[tmp];
direct[tmp+1]=-direct[tmp+1];
return move(list,direct,sum)+time;
}else{
int time = 0;
for(int i=0;i<list.length;i++){
int des = list[i]*direct[i]<0?list[i]:MAX_LENGTH-list[i];
if(list[i]>0&&list[i]<MAX_LENGTH&&time<des){
time = des;
}
}
return sum+time;
}
}
}
分享到:
相关推荐
《百度历年笔试题解析》 在信息技术领域,面试与笔试是评估求职者技能的重要环节,尤其是对于技术型岗位,如百度这样的互联网巨头,其历年笔试题不仅反映了公司的技术导向,也揭示了当前行业关注的技术热点。本文将...
【百度笔试题】中的知识点主要涉及三个方面:编程题、算法题和系统设计。下面将分别对这三个方面进行详细的解析。 1. **编程题** 这道编程题要求编写一个函数`is_include(char *a, char *b)`,判断字符串`b`的所有...
嵌入式软件笔试题合集嵌入式软件笔试题合集嵌入式软件笔试题合集嵌入式软件笔试题合集嵌入式软件笔试题合集嵌入式软件笔试题合集嵌入式软件笔试题合集嵌入式软件笔试题合集嵌入式软件笔试题合集嵌入式软件笔试题合集...
【百度笔试题】涵盖的内容广泛,涉及编程、算法、系统设计等多个方面,下面将逐一解析这些题目中的知识点。 1. **编程题 - 字符串判断**: 这道题目要求编写一个函数来判断字符串b的所有字符是否都在字符串a中出现...
这些题目涵盖了计算机科学和软件工程中的多个核心概念,主要涉及数据结构、算法、操作系统、网络协议、编程语言特性和软件开发技术。以下是每个题目及其相关的知识点详解...准备这样的笔试题可以提高在IT行业的竞争力。
【标题解析】:“08百度笔试题(北京)”指的是2008年百度公司在北京市进行的一次技术笔试,主要针对系统开发工程师等职位。题目旨在考察应聘者的编程能力、算法理解和系统设计思维。 【描述解析】:16号的百度北京...
原生js操作:驼峰格式和下划线格式互转,json字符串转换……五道题,带答案
C++面试题笔试题C++ 数据结构算法笔试题资料合集: 50个C、C++面试题.pdf C++ 数据结构、算法笔试题.docx C++基础面试题.docx C++开发工程师面试题库.docx C++技能测试试卷一及答案.docx C++技能测试试卷二及答案....
"腾讯百度笔试题"集合了这两家互联网巨头历年来的技术笔试题目,覆盖了多个关键领域,如C语言、数据结构和操作系统等。这些知识点是计算机科学和技术专业学生以及求职者必须掌握的基础。 首先,让我们深入探讨C语言...
1. **百度2008.4.26.doc** - 这可能是一份特定日期(2008年4月26日)的百度笔试题目文档,可能包含了编程题目、逻辑思维题、数据分析题等,反映了当时百度对于技术人才的需求和标准。 2. **baidu.rar** - 这个RAR...
本人收集的几套百度笔试题。 doc格式,需要找工作的可以看看
在本文中,我们将深入探讨数据库相关知识,特别是针对百度笔试题中的几个SQL查询和数据库优化策略。首先,我们来看题目提供的关系模式: User(userId, userName) - 用户关系,包含用户ID和用户名。 Article...
【标题】:“百度最全笔试题”所涵盖的IT知识点主要集中在Java编程语言上,这是一份集合了大量关于Java的面试与笔试问题的资源。Java作为广泛应用的面向对象编程语言,其知识点广泛且深入,涵盖了语法基础、数据结构...
中兴笔试题 中兴笔试题 中兴笔试题 中兴笔试题 v中兴笔试题 中兴笔试题 ...中兴笔试题 中兴笔试题 中兴笔试题 中兴笔试题中兴笔试题 中兴笔试题 中兴笔试题 中兴笔试题 中兴笔试题 中兴笔试题 中兴笔试题 中兴笔试题
java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 ...
- 文件:百度笔试之蚂蚁们和木杆.txt - 这可能是动态规划或概率论的问题,考察的是解决复杂问题的策略和计算能力,需要理解动态规划的状态转移方程或者概率事件的计算。 4. **URL分析**: - 文件:百度笔试之...
有txt格式的,有的是俺在网上搜的网页直接保存下来的。有的题目给出了参考答案,不过不一定正确。我当初笔试的是质量部的软开,笔试题附其中了,其余的更多是运维部的笔试题吧。
大连华信去年的笔试题,可以给各位即将工作的同学一些参考
百度 笔试题 2012
C#笔试题大全C#笔试题大全.C#笔试题大全.C#笔试题大全.C#笔试题大全.C#笔试题大全.C#笔试题大全.C#笔试题大全.C#笔试题大全.C#笔试题大全.C#笔试题大全.C#笔试题大全.C#笔试题大全.C#笔试题大全.C#笔试题大全.,让你...