曼哈顿距离几何意义 矩形面积并

这篇博客探讨了如何利用曼哈顿距离的几何意义解决矩形面积并问题。通过二分答案,构建以坐标点为中心,对角线长度为2*mid的正方形,并讨论了将正方形顺时针旋转45度以简化求解过程。文章提到了在旋转后如何维护正方形的边界,并指出在实际计算中,边长乘以sqrt(2)并不影响求交的结果。虽然数据集比较简单,但未深入讨论交集中是否存在整点的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

11.7

思路:
二分ans,把所有长度>mid的(lf,rg)都搞出来,
然后我们要找出一个点对(u,v),使得|x - u| + |y - v| <= mid。
考虑几何意义,曼哈顿距离的图像限定。
把一个区间(lf,rg)转换成一个点(x,y)。
对于每个点(x,y),我们构建出一个以(x,y)为几何中心,
对角线长2*mid,且对角线平行于坐标轴的正方形。
满足条件的(u,v)就在这个正方形当中(可在边上)。
那么要让所有的(x,y)满足条件,就是看所有正方形是否有交。
我们发现斜45度的正方形交不好求,考虑把正方形扳正。
也就是对于所有的点,都围绕原点顺时针旋转45度。
(当然我们维护一条对角线两端的两个点就好了)
这里维护扳正后正方形的左下角右上角,也就是原正方形的上下两个顶点。
我们发现旋转之后的坐标也不好维护,但是如果我们把正方形边长*sqrt(2),
(x,y)就会转到(y+x,y-x),很好维护。
而且所有的边都*sqrt(2)对求交并没有影响。
其实还应该讨论一下交中有没有整点,不过数据水还是过了。


                
### UVA 13215 Polygonal Park 解题思路 对于UVA 13215 - Polygonal Park 这一题目,主要涉及计算几何中的多边形面积以及路径规划等问题。该问题描述了一个由多个矩形组成的公园,其中一些区域被指定为不可通过的障碍物。目标是从起点到终点找到一条最短路径。 #### 多边形表示与预处理 为了简化后续操作,在读入输入数据之后,可以将所有的矩形转换成线段列表的形式来表达整个地图结构。这样做的好处是可以方便地利用现有的算法库来进行碰撞检测和其他几何运算[^1]。 ```cpp struct Point { double x, y; }; // 定义线段类 class Segment { public: Point start, end; bool operator==(const Segment& other) const { return (start.x == other.start.x && start.y == other.start.y && end.x == other.end.x && end.y == other.end.y); } }; ``` #### 路径寻找策略 采用A*搜索算法作为核心求解手段。考虑到本题特殊性——即存在大量平行于坐标轴的边界条件,因此可以在传统A*基础上加入剪枝优化措施以提高效率: - 使用曼哈顿距离作为启发函数; - 对于已经访问过的节点不再重复考虑其扩展方向; - 当遇到新的更优路径时更新对应位置的状态信息; ```cpp #include <queue> using namespace std; typedef pair<int, int> pii; // 表示(x,y) priority_queue<pair<double, pii>, vector<pair<double, pii>>, greater<>> pq; unordered_map<string, double> dist; // 记录到达各点最小代价 unordered_set<string> visited; // 已经遍历过的位置集合 double heuristic(pii pos, pii goal){ return abs(pos.first-goal.first)+abs(pos.second-goal.second); } void astar_search(Point start_pos, Point target_pos){ string key_start=to_string(start_pos.x)+"_"+to_string(start_pos.y); dist[key_start]=0; while (!pq.empty()){ auto cur=pq.top(); pq.pop(); if(cur.second==target_pos){ break; } // ...省略具体逻辑... } } ``` #### 结果输出 最终结果应按照题目要求格式化打印出来。注意精度控制方面的要求,通常情况下保留两位小数即可满足需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值