牛客4581题详解:圆桌移动问题的最优解算法 | 几何问题实战指南
一、问题理解与算法思路
题目要求计算将圆桌从一个位置移动到另一个位置所需的最少步数,考虑圆桌半径的影响。这个问题考察了曼哈顿距离的计算和几何约束条件的处理。
解题关键步骤:
计算两点间的曼哈顿距离
考虑圆桌半径对移动步数的影响
处理特殊边界情况(两点重合、同一x轴或y轴)
综合计算最终所需步数
二、完整代码实现(带详细注释)
#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; }
三、算法核心解析
曼哈顿距离:两点在标准坐标系上的绝对轴距总和
半径处理:将移动步数转换为考虑半径的整数除法
边界条件:
两点重合时步数为0
同轴移动时简单计算一个方向的步数
对角线移动:取两个方向步数的最大值
四、复杂度分析与优化
时间复杂度:O(1),每个测试用例的处理时间是常数级
空间复杂度:O(1),只使用了固定数量的变量
优化建议:
可以预先计算2*r减少重复计算
使用更高效的输入输出方法
五、常见问题解答
Q:为什么使用曼哈顿距离而不是欧式距离?
A:因为题目中的移动方式更符合曼哈顿距离的定义(只能沿坐标轴方向移动)。
Q:公式中的(2*r-1)有什么作用?
A:这是实现向上取整的技巧,相当于数学中的ceil函数。
Q:如何处理浮点数输入的情况?
A:题目保证输入都是整数,无需处理浮点情况。
原创内容 转载请注明出处