当前位置:首页 > 牛客题解 > 牛客4581题详解:圆桌移动问题的最优解算法 | 几何问题实战指南

牛客4581题详解:圆桌移动问题的最优解算法 | 几何问题实战指南

3周前 (06-29)牛客题解69

截图未命名.jpg 牛客4581题详解:圆桌移动问题的最优解算法 | 几何问题实战指南 曼哈顿距离 几何算法 圆桌问题  最优步数计算 第1张

一、问题理解与算法思路

题目要求计算将圆桌从一个位置移动到另一个位置所需的最少步数,考虑圆桌半径的影响。这个问题考察了曼哈顿距离的计算和几何约束条件的处理。

解题关键步骤‌:

  1. 计算两点间的曼哈顿距离

  2. 考虑圆桌半径对移动步数的影响

  3. 处理特殊边界情况(两点重合、同一x轴或y轴)

  4. 综合计算最终所需步数

二、完整代码实现(带详细注释)

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int r, x1, y1, x2, y2;  // 定义变量:半径和两个坐标点
    // 使用while循环处理多组输入
    while(cin >> r >> x1 >> y1 >> x2 >> y2){
        // 计算中心点之间的曼哈顿距离分量
        int dx = abs(x1 - x2);  // x轴方向距离
        int dy = abs(y1 - y2);  // y轴方向距离
        
        // 处理圆桌半径限制
        if (dx == 0 && dy == 0) {
            // 两点重合时不需要移动
            cout << 0 << endl;
        } else if (dx == 0) {
            // 仅y轴有距离时,计算考虑半径的步数
            cout << (dy + 2*r - 1) / (2*r) << endl;
        } else if (dy == 0) {
            // 仅x轴有距离时,计算考虑半径的步数
            cout << (dx + 2*r - 1) / (2*r) << endl;
        } else {
            // 对角线移动时,取两个方向的最大步数
            cout << max((dx + 2*r - 1)/(2*r), (dy + 2*r - 1)/(2*r)) << endl;
        }
    }
    return 0;
}

三、算法核心解析

  1. 曼哈顿距离‌:两点在标准坐标系上的绝对轴距总和

  2. 半径处理‌:将移动步数转换为考虑半径的整数除法

  3. 边界条件‌:

    • 两点重合时步数为0

    • 同轴移动时简单计算一个方向的步数

  4. 对角线移动‌:取两个方向步数的最大值

四、复杂度分析与优化

  1. 时间复杂度‌:O(1),每个测试用例的处理时间是常数级

  2. 空间复杂度‌:O(1),只使用了固定数量的变量

  3. 优化建议‌:

    • 可以预先计算2*r减少重复计算

    • 使用更高效的输入输出方法

五、常见问题解答

Q:为什么使用曼哈顿距离而不是欧式距离?
A:因为题目中的移动方式更符合曼哈顿距离的定义(只能沿坐标轴方向移动)。

Q:公式中的(2*r-1)有什么作用?
A:这是实现向上取整的技巧,相当于数学中的ceil函数。

Q:如何处理浮点数输入的情况?
A:题目保证输入都是整数,无需处理浮点情况。


原创内容 转载请注明出处

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。