`
MouseLearnJava
  • 浏览: 466119 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

5个钢珠离开凹轨的最短时间和最长时间

    博客分类:
  • Java
阅读更多
问题:在一个长为33厘米的光滑凹轨上,在第3厘米、第6厘米、第19厘米、第22厘米、第26厘米处各有一个钢珠,凹轨很细,不能同时通过两个钢珠,开始时,钢珠运动方向是任意的。两个钢珠相撞后,以相同速度反向运动。假设所有钢珠初始速度为每秒运动1厘米,那么所有钢珠离开凹轨的最短和最长时间是多少?



分析:5个钢珠的移动方向都有两种可能:向左或者向右。这样钢珠运动的组合就有2的5次方,也就是32种。


最少时间是:14

最大时间是:30

第1种情况的初始方向是:  Left  Left  Left  Left  Left -- 花费的时间是:26

第2种情况的初始方向是:  Right  Left  Left  Left  Left -- 花费的时间是:30

第3种情况的初始方向是:  Left  Right  Left  Left  Left -- 花费的时间是:27

第4种情况的初始方向是:  Right  Right  Left  Left  Left -- 花费的时间是:30

第5种情况的初始方向是:  Left  Left  Right  Left  Left -- 花费的时间是:26

第6种情况的初始方向是:  Right  Left  Right  Left  Left -- 花费的时间是:30

第7种情况的初始方向是:  Left  Right  Right  Left  Left -- 花费的时间是:27

第8种情况的初始方向是:  Right  Right  Right  Left  Left -- 花费的时间是:30

第9种情况的初始方向是:  Left  Left  Left  Right  Left -- 花费的时间是:26

第10种情况的初始方向是:  Right  Left  Left  Right  Left -- 花费的时间是:30

第11种情况的初始方向是:  Left  Right  Left  Right  Left -- 花费的时间是:27

第12种情况的初始方向是:  Right  Right  Left  Right  Left -- 花费的时间是:30

第13种情况的初始方向是:  Left  Left  Right  Right  Left -- 花费的时间是:26

第14种情况的初始方向是:  Right  Left  Right  Right  Left -- 花费的时间是:30

第15种情况的初始方向是:  Left  Right  Right  Right  Left -- 花费的时间是:27

第16种情况的初始方向是:  Right  Right  Right  Right  Left -- 花费的时间是:30

第17种情况的初始方向是:  Left  Left  Left  Left  Right -- 花费的时间是:22

第18种情况的初始方向是:  Right  Left  Left  Left  Right -- 花费的时间是:30

第19种情况的初始方向是:  Left  Right  Left  Left  Right -- 花费的时间是:27

第20种情况的初始方向是:  Right  Right  Left  Left  Right -- 花费的时间是:30

第21种情况的初始方向是:  Left  Left  Right  Left  Right -- 花费的时间是:22

第22种情况的初始方向是:  Right  Left  Right  Left  Right -- 花费的时间是:30

第23种情况的初始方向是:  Left  Right  Right  Left  Right -- 花费的时间是:27

第24种情况的初始方向是:  Right  Right  Right  Left  Right -- 花费的时间是:30

第25种情况的初始方向是:  Left  Left  Left  Right  Right -- 花费的时间是:19

第26种情况的初始方向是:  Right  Left  Left  Right  Right -- 花费的时间是:30

第27种情况的初始方向是:  Left  Right  Left  Right  Right -- 花费的时间是:27

第28种情况的初始方向是:  Right  Right  Left  Right  Right -- 花费的时间是:30

第29种情况的初始方向是:  Left  Left  Right  Right  Right -- 花费的时间是:14

第30种情况的初始方向是:  Right  Left  Right  Right  Right -- 花费的时间是:30

第31种情况的初始方向是:  Left  Right  Right  Right  Right -- 花费的时间是:27

第32种情况的初始方向是:  Right  Right  Right  Right  Right -- 花费的时间是:30

//方向枚举类
public enum Direction {

	RIGHT, LEFT;

	public boolean isRight() {
		return RIGHT == this;
	}

	public boolean isLeft() {
		return LEFT == this;
	}

}


//钢珠球类
public class Ball {

	/*
	 * 
	 * 钢球所在的位置
	 * 
	 */

	private int location;

	/*
	 * 
	 * 钢球移动的方向
	 * 
	 */

	private Direction direction;

	/*
	 * 
	 * 钢球是否已经滚落凹轨
	 * 
	 */

	private boolean completed = false;

	public Ball() {
	}

	public Ball(int location, Direction direction) {
		this.location = location;
		this.direction = direction;
	}

	/**
	 * 
	 * 钢球移动
	 * 
	 */

	public void move() {

		if (!completed) {
			if (direction.isRight()) {
				location += 1;

			} else if (direction.isLeft()) {
				location -= 1;

			}

			/**
			 * 
			 * 在一个长为33厘米的光滑凹轨上,在第3厘米、第6厘米、第19厘米、第22厘米、第26厘米处各有一个钢珠,
			 * 
			 */

			if (location <= 0 || location >= 33) {
				completed = true;
			}
		}
	}

	/**
	 * 
	 * 判断钢球的位置是否有冲突。
	 * 
	 */

	public boolean isLocationConfilict(Ball ant) {
		return this.location == ant.location;
	}

	/**
	 * 
	 * 当钢球位置冲突的时候,需要转换钢球的方向。
	 * 
	 */

	public void changeDirection() {

		switch (direction) {

		case RIGHT:
			direction = Direction.LEFT;
			break;

		case LEFT:
			direction = Direction.RIGHT;
			break;

		default:
			break;

		}

	}

	/**
	 * 
	 * @return the completed
	 * 
	 */

	public boolean isCompleted() {

		return completed;

	}

	/**
	 * 
	 * @param completed
	 * 
	 * the completed to set
	 * 
	 */

	public void setCompleted(boolean completed) {

		this.completed = completed;

	}

	/**
	 * 
	 * @return the direction
	 * 
	 */

	public Direction getDirection() {

		return direction;

	}

	/**
	 * 
	 * @param direction
	 * 
	 * the direction to set
	 * 
	 */

	public void setDirection(Direction direction) {

		this.direction = direction;

	}

	/**
	 * 
	 * @return the location
	 * 
	 */

	public int getLocation() {

		return location;

	}

	/**
	 * 
	 * @param location
	 * 
	 * the location to set
	 * 
	 */

	public void setLocation(int location) {

		this.location = location;

	}

}


//钢球移动的场景类

/**
 * 在一个长为33厘米的光滑凹轨上,在第3厘米、第6厘米、第19厘米、第22厘米、第26厘米处各有一个钢珠,
 * 凹轨很细,不能同时通过两个钢珠,开始时,钢珠运动方向是任意的。两个钢珠相撞后,以相同速度反向运动。
 * 假设所有钢珠初始速度为每秒运动1厘米,那么所有钢珠离开凹轨的最短和最长时间是多少?
 */

public class BallMoveScene {

	/*
	 * 5只钢球的初始位置
	 */

	private static int[] locations = { 3, 6, 19, 22, 26 };

	private int minElapsedTime = 0;

	private int maxElapsedTime = 0;

	public void proceed() {
		for (int i = 0; i < 32; i++) {
			
			Ball[] balls = buildInitializedBalls(initialDirections(i));
			
			printInitialDirections(balls, i);
			
			int elapsedTime = 0;
			
			while (!isAllBallsCompleted(balls)) {
				move(balls);
				handleLocationConfilict(balls);
				elapsedTime++;
			}

			System.out.println("-- 花费的时间是:" + elapsedTime);

			if (minElapsedTime == 0 || (elapsedTime < minElapsedTime)) {

				minElapsedTime = elapsedTime;

			}

			if (maxElapsedTime == 0 || (elapsedTime > maxElapsedTime)) {

				maxElapsedTime = elapsedTime;

			}

		}

		System.out.println("最少时间是:" + minElapsedTime);

		System.out.println("最大时间是:" + maxElapsedTime);

	}

	/**
	 * 
	 * 输出第n种的钢珠初始化方向。
	 * 
	 */

	private void printInitialDirections(Ball[] balls, int n) {

		System.out.print("第" + (n + 1) + "种情况的初始方向是: ");

		for (Ball ball : balls) {

			System.out.print(ball.getDirection().isLeft() ? " Left "

			: " Right ");

		}

	}

	/**
	 * 
	 * 判断是否有钢珠位置冲突, 如果位置有冲突,那么这两只钢珠的方向将改变。
	 * 
	 */

	private void handleLocationConfilict(Ball[] balls) {

		for (int i = 0; i < balls.length; i++) {
			for (int j = i + 1; j < balls.length; j++) {
				if (balls[i].isLocationConfilict(balls[j])) {
					balls[i].changeDirection();
					balls[j].changeDirection();
				}
			}
		}
	}

	/**
	 * 
	 * 钢珠移动
	 * 
	 */

	private void move(Ball[] balls) {
		for (Ball ball : balls) {
			ball.move();
		}
	}

	/**
	 * 
	 * 5只钢珠,每只钢珠可以向左(朝0的方向走),也可以向右(朝27的方向走), 这样的话有2的5次方,也就是32种情况。
	 * 
	 * 可以从0~31来遍历,初始化钢珠的开始位置 0代码向左,1代码向右。
	 * 
	 */

	private Direction[] initialDirections(int value) {

		int[] result = new int[5];

		result[0] = value % 2;

		result[1] = value / 2 % 2;

		result[2] = value / 4 % 2;

		result[3] = value / 8 % 2;

		result[4] = value / 16 % 2;

		Direction[] directions = new Direction[result.length];

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

			if (0 == result[i]) {

				directions[i] = Direction.LEFT;

			} else {

				directions[i] = Direction.RIGHT;

			}

		}

		return directions;

	}

	/**
	 * 
	 * @param directions
	 * 
	 * 初始化的方向
	 * 
	 * @return 返回初始化5个钢球的最初状态,包括初始化的位置以及初始化的方向。
	 * 
	 */

	private Ball[] buildInitializedBalls(Direction[] directions) {

		Ball[] Balls = new Ball[5];
		for (int i = 0; i < 5; i++) {
			Balls[i] = new Ball(locations[i], directions[i]);
		}

		return Balls;

	}

	/**
	 * 
	 * 判断所有的钢球是否都离开凹轨
	 * 
	 */

	private boolean isAllBallsCompleted(Ball[] Balls) {

		for (Ball Ball : Balls) {
			if (!Ball.isCompleted()) {
				return false;
			}
		}
		return true;
	}

}


//测试类
public class Test {
	
	public static void main(String[] args) {

		new BallMoveScene().proceed();

	}

}


测试结果:
第1种情况的初始方向是:  Left  Left  Left  Left  Left -- 花费的时间是:26
第2种情况的初始方向是:  Right  Left  Left  Left  Left -- 花费的时间是:30
第3种情况的初始方向是:  Left  Right  Left  Left  Left -- 花费的时间是:27
第4种情况的初始方向是:  Right  Right  Left  Left  Left -- 花费的时间是:30
第5种情况的初始方向是:  Left  Left  Right  Left  Left -- 花费的时间是:26
第6种情况的初始方向是:  Right  Left  Right  Left  Left -- 花费的时间是:30
第7种情况的初始方向是:  Left  Right  Right  Left  Left -- 花费的时间是:27
第8种情况的初始方向是:  Right  Right  Right  Left  Left -- 花费的时间是:30
第9种情况的初始方向是:  Left  Left  Left  Right  Left -- 花费的时间是:26
第10种情况的初始方向是:  Right  Left  Left  Right  Left -- 花费的时间是:30
第11种情况的初始方向是:  Left  Right  Left  Right  Left -- 花费的时间是:27
第12种情况的初始方向是:  Right  Right  Left  Right  Left -- 花费的时间是:30
第13种情况的初始方向是:  Left  Left  Right  Right  Left -- 花费的时间是:26
第14种情况的初始方向是:  Right  Left  Right  Right  Left -- 花费的时间是:30
第15种情况的初始方向是:  Left  Right  Right  Right  Left -- 花费的时间是:27
第16种情况的初始方向是:  Right  Right  Right  Right  Left -- 花费的时间是:30
第17种情况的初始方向是:  Left  Left  Left  Left  Right -- 花费的时间是:22
第18种情况的初始方向是:  Right  Left  Left  Left  Right -- 花费的时间是:30
第19种情况的初始方向是:  Left  Right  Left  Left  Right -- 花费的时间是:27
第20种情况的初始方向是:  Right  Right  Left  Left  Right -- 花费的时间是:30
第21种情况的初始方向是:  Left  Left  Right  Left  Right -- 花费的时间是:22
第22种情况的初始方向是:  Right  Left  Right  Left  Right -- 花费的时间是:30
第23种情况的初始方向是:  Left  Right  Right  Left  Right -- 花费的时间是:27
第24种情况的初始方向是:  Right  Right  Right  Left  Right -- 花费的时间是:30
第25种情况的初始方向是:  Left  Left  Left  Right  Right -- 花费的时间是:19
第26种情况的初始方向是:  Right  Left  Left  Right  Right -- 花费的时间是:30
第27种情况的初始方向是:  Left  Right  Left  Right  Right -- 花费的时间是:27
第28种情况的初始方向是:  Right  Right  Left  Right  Right -- 花费的时间是:30
第29种情况的初始方向是:  Left  Left  Right  Right  Right -- 花费的时间是:14
第30种情况的初始方向是:  Right  Left  Right  Right  Right -- 花费的时间是:30
第31种情况的初始方向是:  Left  Right  Right  Right  Right -- 花费的时间是:27
第32种情况的初始方向是:  Right  Right  Right  Right  Right -- 花费的时间是:30
最少时间是:14
最大时间是:30
分享到:
评论

相关推荐

    三节钢珠滑轨安装方法、抽屉导轨详细安装.docx

    《三节钢珠滑轨安装指南——抽屉导轨详细步骤解析》 三节钢珠滑轨是现代家具中常见的抽屉导向系统,其稳定性和耐用性受到广泛认可。尽管对于专业人士来说,安装可能并不复杂,但对于不熟悉这一领域的用户来说,可能...

    三节钢珠滑轨的安装方法、抽屉导轨详细安装.doc

    总结来说,安装三节钢珠滑轨并不复杂,主要涉及尺寸测量、孔位标记和螺丝固定三个环节。遵循这些步骤,即使是初学者也能顺利完成抽屉导轨的安装。记住,耐心和细心是成功的关键,而理解每个步骤的目的和作用则能使...

    阿里巴巴最新C++工程师笔试题.pdf

    假设所有钢珠初速度为每秒运动1厘米,那么所有钢珠离开凹轨的最长可能时间是?这个问题考查了数学中的运动问题。 知识点:数学、运动问题。 八、编程语言:给定如下代码:int x[4]={0}; int y[4]={1}; 数组x和y的...

    基于STC15单片机的管道内钢珠运动测量装置设计与实现.pdf

    本文的测量装置用于检测管道内钢珠的运动速度、数量、方向以及运动周期,并通过统计分析法建立数学模型,利用小球运动时间和管道倾斜角度的对应关系,准确测量钢珠运动过程中的角度变化。 在系统分析部分,文献指出...

    基于STC12C5A60S2单片机管道内钢珠运动测量系统的设计.pdf

    由于钢珠经过两个传感器的间隔时间与管道的倾斜角度具有复杂的非线性关系,因此需要运用运动学知识和数据采集处理技术来准确测量。系统通过捕获传感器输出的脉冲信号,结合重力公式和几何关系,计算出管道倾斜角度,...

    基于电感传感器的钢珠直径分选器设计

    以电感传感器在钢珠直径分选电路中的应用为例,提出了电感传感器应用电路的设计思路,即电路功能分析、框图设计、测量电路仿真,把钢珠直径的微位移信号检测出来并转换成便于传输、处理和显示的电压信号,再利用信号...

    2017年电子设计大赛 M题 管道内钢珠运动测量装置.pdf

    整体来看,该设计是一个完整的系统工程,涵盖了电子设计的多个方面,如传感器技术、嵌入式系统设计、信号处理、人机界面设计及电源管理等。设计过程中不仅需要考虑硬件选型和电路设计的合理性,还需要考虑系统的稳定...

    上银 线性滑轨技术手册.pdf

    - **多方向负载承受能力**:独特的约束结构设计使其可以同时承受来自多个方向的负载,提高了机械平台的稳定性和运行精度。 - **组装简便与互换性**:安装过程简单快捷,具有良好的互换性,便于维护和更换。 - **...

    上银直线导轨

    - **多方向负载能力**:能够同时承受多个方向上的负载,提供稳定的支撑。 - **组装简单并具有互换性**:安装过程较为简便,并且各个部件之间具有较好的互换性。 - **润滑构造简单**:润滑系统的设置较为简单,便于...

    行业文档-设计装置-采用钢珠结构的显微镜平台调节装置.zip

    总的来说,"采用钢珠结构的显微镜平台调节装置"是一个创新的设计方案,它结合了机械工程学的原理和精密光学的需求,旨在提升显微镜操作的精度和效率。通过深入研究这份文档,我们可以了解到更多关于显微镜平台设计的...

    管道钢珠.doc

    在方案一中,通过测量小球通过两个传感器的时间差和两传感器之间的距离,可以利用公式计算出小球的运动加速度a。进一步地,根据a与重力加速度g的关系,可以求得管道的倾角α。这一过程不仅验证了方案的有效性,也为...

    电子-一种电位器自动钢珠包装机的钢珠安装装置

    电位器自动钢珠包装机的钢珠安装装置是电子生产设备的一个细分领域,涉及机械设计、自动化控制、传感器技术等多个方面。这种装置可能包含精密的机械结构,用于抓取、定位和安装钢珠,同时可能集成有电气控制系统,如...

    管道内钢珠运动测量装置.doc

    该文档介绍了一个基于嵌入式系统的管道内钢珠运动测量装置,主要利用TL-W5MC1金属感应接近开关、AT89C51单片机和Adxl335三轴角度传感器来检测和分析钢珠在管道内的运动状态。这个装置设计简洁,能够有效地测量钢珠...

    反光的钢珠如何找轮廓的方法

    此外,如果钢珠在图像中是动态的或有多个钢珠存在,还可以利用Halcon的模板匹配功能来定位钢珠。通过预先创建一个无反光状态的钢珠模型,然后用“match_shape_model”算子来搜索相似形状,可以更准确地找到反光钢珠...

    阿里笔试题集合

    假设所有钢珠初始速度为每秒运动 1 厘米,那么所有钢珠离开凹轨的最长可能时间是多少? A、30(错误) B、26(错误) C、38(正确) D、33(错误) 7. std::vector::iterator: std::vector::iterator 是 C++ ...

    基于IAP15W4K58S4单片机的管道内钢珠运动测量装置研究.pdf

    管道运输在化工、石油、食品加工等多个行业中非常常见,确保管道内物品如钢珠的顺畅运动对于生产效率至关重要。管道内钢珠运动的测量可以用来评估管道的运输能力、检测管道是否存在阻塞或泄漏等问题。为实现此测量,...

    阿里笔试题+解析 完整

    根据题目描述,钢珠相撞后反向运动,因此所有钢珠离开凹轨的最长可能时间是所有钢珠按顺序相遇后各自反向运动所需的时间。最后一个钢珠在第33厘米处,所以最长时间为33 - 3 = 30厘米,对应选项A。 11. `std::vector...

    基于工业机器人和机器视觉的液压阀钢珠自动压装设备研究.pdf

    液压阀钢珠自动压装设备是一项将工业机器人技术和机器视觉相结合的高新技术,旨在提升液压阀钢珠压装过程的自动化水平和效率。在液压阀的生产过程中,钢珠压装是关键步骤之一,以往多依赖人工操作,效率较低且易出现...

    钢珠式减振器在铣床模型机上的减振实验研究.zip

    《钢珠式减振器在铣床...综上所述,"钢珠式减振器在铣床模型机上的减振实验研究"是一个综合性的机械工程课题,涵盖了振动理论、减振技术、CAD设计、实验方法等多个方面,对于提升铣床性能、保障加工质量具有重要意义。

Global site tag (gtag.js) - Google Analytics