Java海龟timeToArrival方法计算结果不符,求排查逻辑漏洞
问题排查与修正方案
核心问题分析
你的代码存在三个关键逻辑错误,直接导致评测结果不符:
强制重置海龟初始方向
代码中this.turtles[i].setDirection(0);完全违背需求——海龟的初始方向是它当前的朝向,不是固定为0度。这会导致所有海龟的旋转角度计算基于错误的起始方向,完全偏离实际场景。旋转角度计算逻辑错误
directionTowards(x,y)方法返回的是目标点的绝对方向(通常是从x轴正方向到目标点的角度),而非相对于海龟当前方向的差值。你需要计算的是海龟当前方向与目标绝对方向的差值,再取最短旋转路径,而不是直接对directionTowards的结果做判断。冗余/错误代码
this.turtles[i].penDown();属于无用操作,计算到达时间不需要控制画笔状态distTo变量未声明,会导致编译错误(你粘贴代码时可能遗漏,但实际运行必须声明)
修正后的代码实现
public double timeToArrival(double x, double y) { double bestTime = Double.MAX_VALUE; for (int i = 0; i < this.turtles.length; i++) { Turtle turtle = this.turtles[i]; // 获取海龟当前的方向 double currentDir = turtle.getDirection(); // 获取目标点的绝对方向 double targetDir = turtle.directionTowards(x, y); // 计算方向差值并归一化到[-180, 180]范围 double angleDiff = targetDir - currentDir; angleDiff = (angleDiff + 360) % 360; if (angleDiff > 180) { angleDiff = 360 - angleDiff; } // 获取到目标点的距离 double distTo = turtle.distanceTo(x, y); // 计算当前海龟的总到达时间:旋转时间+移动时间 double totalTime = angleDiff + distTo; // 更新最短时间 if (totalTime < bestTime) { bestTime = totalTime; } } return bestTime; }
关键逻辑说明
- 方向差值归一化:通过
(angleDiff + 360) % 360将角度差值转换为0-360范围,再判断是否大于180°,取最短旋转路径(顺时针或逆时针) - 保留海龟初始方向:不再强制重置方向,使用
turtle.getDirection()获取当前朝向,确保旋转角度计算符合实际 - 移除无用操作:删除
setDirection(0)和penDown(),避免干扰海龟状态或计算逻辑
内容的提问来源于stack exchange,提问作者Wrath Of Parking Lot
相关产品推荐
相关产品推荐

