您的位置:首页 > 编程语言 > Java开发

JAVA代码—算法基础:蚂蚁爬行问题

2018-02-24 12:53 633 查看
[b]蚂蚁爬行问题[/b]

题目描述如下:

1、有一根100厘米的细木杆,在第15厘米、20厘米、25厘米、38厘米、42厘米、50厘米这六个位置上各有一只蚂蚁。

2、木杆很细,不能同时通过两只蚂蚁。

3、开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。

4、当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。

5、假设蚂蚁们每秒钟可以走一厘米的距离。

编写程序,求所有蚂蚁都离开木杆 的最小时间和最大时间。

解题思路:

初次看到这道题,一定会觉得非常复杂。但是仔细想想看,两只蚂蚁相撞,它们会同时掉头朝反向走。例如A和B相遇(相撞),现在A掉头反向走,B也掉头反向走。假设现在把A看作是B,而B看做是A,其实他们的速度都是相同的,相当于把他们做一个交换也无妨。这也就相当于和A与B其实是没有关系的。

关于最短时间:

位于细木杆中间的那只蚂蚁到达某一端的最小时间。

关于最长时间:

所以最长的时间为左端的蚂蚁到右端的时间和右端的蚂蚁到左端的时间两者中的最大值。

所以本题给出的数据分析结果为:最短时间为:50;最长时间为:85

算法设计:

//输入参数l为细木杆的长度;x[]数组为蚂蚁的位置
public static void solve(int l, int x[]) {

if (0 >= x.length)

return;

int min, max;

min = max = 0;

int d1, d2;

for (int i = 0; i < x.length; i++) {

if (x[i] <= l - x[i]) {

d1 = x[i];

d2 = l - x[i];

} else {

d1 = l - x[i];

d2 = x[i];

}

if (min < d1) {

min = d1;

}

if (max < d2) {

max = d2;

}

}

System.out.println(min + "    " + max);

}


[b]算法设计(2)完整代码[/b]

package com.bean.basic;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class AntsCrawlingProblem {

/*
* 蚂蚁爬行问题的描述:
* n 只蚂蚁以每秒1cm的速度在长为Lcm的竹竿上爬行。当蚂蚁看到竿子的端点时就会落下来。
* 由于竿子太细,两只蚂蚁相遇时,它们不能交错通过,只能各自反方向爬行。
* 对于每只蚂蚁,我们只知道它离竿子最左端的距离为xi,但不知道它当前的朝向。
* 请计算所有蚂蚁落下竿子的最短时间和最长时间。
*
* 限制条件:
* 1<=L<=10的6次方
* 1<=n<=10的6次方
* 0<=xi<=L
*
* 样例:
* 输入
* L=10
* n=3
* x={2,6,7}
*
* 输出
* min=4 {左、右、右}
* max=8 {右、右、右}
*
* 样例输入
* 6 100
* 25 20 50 38 42 15
* The minimum time is: 50
* The maximum time is: 85

* */

public static void main(String[] args) throws FileNotFoundException {
long start = System.currentTimeMillis();
System.setIn(new FileInputStream("D:\\SamplData\\Ants_input.txt"));
Scanner sc = new Scanner(System.in);

while (sc.hasNext()) {
//测试用例数量
int T = sc.nextInt();
for(int t=0; t<T; t++){
int ant = sc.nextInt();//蚂蚁数目
int len = sc.nextInt();//水平长度
//构造蚂蚁数量的数组,用来存储每个蚂蚁的位置
int[] ants = new int[ant];//每只蚂蚁距离
//计算细木棍的中点位置
int lens = len / 2;//水平中点长度
//顺序读取每个蚂蚁所在的位置
for(int i=0; i<ant; i++){
int dis = sc.nextInt();
if(lens >= dis){
ants[i] = dis;
}else {
ants[i] = len - dis;//全长-远距离=近距离
}
}
int max = 0;
int min = lens;
for(int i=0; i<ant; i++){
max = Math.max(max, ants[i]);//要所有蚂蚁都掉下来,则最早时间是位于中点位置处的蚂蚁到达端点的时间
min = Math.min(min, ants[i]);//最晚掉下来的蚂蚁是距离一个端点最近的相反方向的端点。
}
System.out.println(max + " " + (len-min));
}

}

long end = System.currentTimeMillis();
System.out.println("Spent Time: " + (end - start));

}

}


输入文件内容:

2

6 100

25 20 50 38 42 15

3 10

2 6 7

输出结果:

50 85

4 8

Spent Time: 37

(完)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: