酷代码 AI
菜单
服务商

小鱼运动探测危险判断C++实现

好的,这个问题是一个关于运动的模拟判断,我们一步一步来分析解决。 ## 🐟 问题理解 - **小鱼**从 A 点(位置 0)出发,向右游。 - **第一秒**游 7 米。 - **从第二秒开始**,每秒游的距离是前一秒的 98%。 - **探测器**安装在距离 A 点右边 **s** 米处,探测范围是 `[s - x, s + x]`。 - **规则**: - 一旦小鱼进入这个范围,探测器就会在这一秒**结束**时通知猎人。 - 猎人在**下一秒**开始抓捕(抓捕持续整个下一秒)。 - 如果小鱼在**下一秒结束前**游出探测范围,就是安全的;否则危险。 - 安全条件:**进入探测范围的下一秒结束时,小鱼已经游出探测范围**。 换句话说: - 小鱼可能在某一秒**结束时**处在范围内(触发警报)。 - 如果下一秒结束时小鱼还在范围内,则危险;否则安全。 ## ⚙️ 输入与输出 - 输入:`s x`(正整数) - 输出:`'y'` 或 `'n'` ## 🧮 算法思路 1. 用变量 `pos` 表示当前小鱼的位置(初始为 0)。 2. 用变量 `speed` 表示当前秒的游动距离(初始为 7)。 3. 用变量 `time` 记录当前是第几秒(从 1 开始)。 4. 循环模拟每一秒: - 先判断在这一**秒开始时**小鱼是否已经在探测范围内。 - 如果已经在范围内,说明这一秒**结束**时会触发警报。 - 然后小鱼向前游 `speed` 米。 - 如果之前已触发警报,判断下一秒结束时小鱼是否还在范围内: - 如果还在,输出 `'y'`,结束。 - 如果已经出去,输出 `'n'`,结束。 - 更新 `speed` 为 `speed * 0.98`,时间增加。 5. 注意:如果小鱼在游完这一秒后才进入范围,则等到这一秒结束时才触发报警,需要再模拟下一秒判断。 **更好的简化方法**: - 直接模拟鱼每一**秒**的移动,着重判断: - 当前秒开始时是否已在范围内 → 是,则上一秒结束时已触发警报,需要判断下一秒是否安全。 - 当前秒开始前的位置 < 探测区左端,游完后 >= 探测区左端 → 触发警报,判断下一秒。 但更简洁的方式是记录**进入范围的时间点**,然后看下一秒结束时有没有出去。 ## 💻 C++ 代码实现 ```cpp #include <iostream> #include <cmath> using namespace std; int main() { int s, x; cin >> s >> x; double left = s - x; // 探测范围左边界 double right = s + x; // 探测范围右边界 double pos = 0.0; // 小鱼当前位置 double speed = 7.0; // 当前秒速度 int time = 1; // 当前秒数 bool entered = false; // 是否已进入探测范围 while (true) { // 检查这一秒开始时是否已经在探测范围内 if (pos >= left && pos <= right) { // 已经在范围内(上一秒结束时触发了警报) // 需要判断下一秒结束时是否还在范围内 double nextPos = pos + speed; if (nextPos >= left && nextPos <= right) { cout << "y" << endl; return 0; } else { cout << "n" << endl; return 0; } } // 否则,模拟这一秒的移动 double nextPos = pos + speed; // 如果在这一秒结束时进入探测范围 if (nextPos >= left && pos < left) { // 触发警报,需要看下一秒 entered = true; double speedNext = speed * 0.98; double posAfterNext = nextPos + speedNext; if (posAfterNext >= left && posAfterNext <= right) { cout << "y" << endl; return 0; } else { cout << "n" << endl; return 0; } } // 更新位置和速度 pos = nextPos; speed *= 0.98; time++; // 如果已经超过探测范围很远,可以退出(安全) if (pos > right + 1000) { cout << "n" << endl; return 0; } } return 0; } ``` ## 🔍 代码解释 - `left = s - x`, `right = s + x`:探测范围的左右边界。 - `pos`:小鱼当前位置,初始在 0。 - `speed`:当前秒的游动距离,初始 7。 - **主要逻辑**: 1. 先检查当前秒开始时是否已在范围内 → 如果是,说明上一秒结束时已触发警报,直接判断下一秒结束时是否安全。 2. 否则,模拟这一秒的移动,并检查移动后是否在下一秒结束时进入范围 → 进入则触发警报,再判断下一秒的安全性。 - 如果游出很远仍未进入,直接判定安全。 ## ✅ 样例验证 - 输入:`10 2` 探测范围 [8,12]。 第1秒末:7,未进入。 第2秒初:7,游出6.86,13.86 > 12 → 未进入,安全。 输出 `n`。 - 输入:`13 3` 探测范围 [10,16]。 第1秒末:7,未进入。 第2秒末:7+6.86=13.86,已进入,下一秒游6.7228 → 20.5828 > 16,安全。 输出 `n`。 ## ⚠️ 开发建议 - **浮点数精度**:使用 `double` 避免精度误差影响边界判断。 - **边界条件**:注意 `>` 和 `>=` 的正确使用,防止误判“刚好在边界”的情况。 - **死循环预防**:添加退出条件(如距离超出范围很远),避免无限循环。 - **可读性**:给变量和逻辑添加注释,方便后续维护。 --- ######[AI写代码神器 | 1433点数解答 | 2026-05-31 08:30:34]

相关提问
本站限时免费提问中
实用工具查看更多
Linux在线手册 [开发类]
Jquery在线手册 [开发类]
今日油价 [生活类]
图片互转base64 [开发类]
时间转换器 [开发类]