博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA代码—算法基础:蚂蚁爬行问题
阅读量:4041 次
发布时间:2019-05-24

本文共 2455 字,大约阅读时间需要 8 分钟。

蚂蚁爬行问题

题目描述如下:

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);    }
算法设计(2)完整代码
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
= dis){ ants[i] = dis; }else { ants[i] = len - dis;//全长-远距离=近距离 } } int max = 0; int min = lens; for(int i=0; i

输入文件内容:

2
6 100
25 20 50 38 42 15
3 10
2 6 7

输出结果:

50 85

4 8
Spent Time: 37

(完)

转载地址:http://ugvdi.baihongyu.com/

你可能感兴趣的文章
学习设计模式(3)——单例模式和类的成员函数中的静态变量的作用域
查看>>
自然计算时间复杂度杂谈
查看>>
当前主要目标和工作
查看>>
使用 Springboot 对 Kettle 进行调度开发
查看>>
如何优雅的编程,lombok你怎么这么好用
查看>>
一文看清HBase的使用场景
查看>>
解析zookeeper的工作流程
查看>>
搞定Java面试中的数据结构问题
查看>>
慢慢欣赏linux make uImage流程
查看>>
linux内核学习(7)脱胎换骨解压缩的内核
查看>>
以太网基础知识
查看>>
慢慢欣赏linux 内核模块引用
查看>>
kprobe学习
查看>>
慢慢欣赏linux phy驱动初始化2
查看>>
慢慢欣赏linux CPU占用率学习
查看>>
2020年终总结
查看>>
Homebrew指令集
查看>>
React Native(一):搭建开发环境、出Hello World
查看>>
React Native(二):属性、状态
查看>>
JSX使用总结
查看>>