- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我试图理解 Steven Halim 和 Felix Halim 的书 Competitive Programming 中的“凸包”算法。 “凸包”问题是,给定平面中 n 个点的集合 P,找到一个子集 CH(P ) 形成包含所有其他点的凸多边形的顶点。这是一张概述他们方法的图片:
他们的算法首先根据点相对于“枢轴”的角度对点进行排序,即 P 中最底部和最右侧的点。
我在理解他们的 angle_comp
函数时遇到了一些问题——它的作用是什么,它的目的是什么。谁能帮我理解一下?
typedef struct {
double x, y ;
} point;
point pivot;
// A function to compute the distance between two points:
double dist2 (point a, point b)
{
double dx = a.x - b.x ;
double dy = a.y - b.y ;
return sqrt (dx *dx + dy * dy) ;
}
// A function to compare the angles of two points with respect to the pivot:
bool angle_comp (point a, point b)
{
if (fabs(area2(pivot, a, b) - 0) < 10e-9)
return dist2(pivot, a) < dist2(pivot, b);
int d1x = a.x - pivot.x, d1y = a.y - pivot.y;
int d2x = b.x - pivot.x, d2y = b.y - pivot.y;
return (atan2((double) d1y, (double) d1x)
- atan2 ((double) d2y, (double)d2x))
< 0;
}
最佳答案
如果我没有正确理解你的问题,你想知道为什么排序功能很重要?这是因为您的代码使用了格雷厄姆扫描,这是一种查找凸包的方法。为了使 Graham 扫描更高效,必须根据点相对于固定点的角度对点进行排序。
angle_comp
函数比较两点 A 和 B 相对于枢轴点的角度。当插入到 std::sort
中时,此函数允许我们根据它们相对于枢轴的角度或距枢轴的距离对枢轴周围的所有点进行排序。
对于围绕轴心的两点 A 和 B。如果点 A 和 B 具有相同的角度,或者如果另一个点都在枢轴附近,那么我们需要另一种方法来对这两个点进行排序。我们改为根据点与枢轴的距离对点进行排序。
否则,我们找出点 A 和 B 相对于我们的枢轴的位置。我们通过从我们的点中减去枢轴来做到这一点。因此,例如,如果我们的枢轴是 (4, 3) 而 A 是 (5, 7),则 A 是向右 1 个单位,从我们的枢轴向上 4 个单位。如果我们的枢轴是 (0, 0),那么 A 将是 (1, 4)。希望这是可以理解的。
在我们得到相对点 D 之后,我们接着计算该点相对于我们的枢轴或原点的角度。 atan2
有两个参数,我们点的 y 值和我们点的 x 值,并吐出我们点的角度(以弧度为单位)。对于 atan2
,0 弧度定义为距离原点 (N, 0) 的任意点,随着弧度的增加,该点绕轴心点或原点逆时针旋转。
然后我们从 D2 的角度中减去 D 的角度。如果 D2 的角度大于 D1 的角度,我们返回 true,std::sort
可以使用返回的数据对角度进行逆时针排序。
关于c++ - "competitive programming 1"的凸包代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18040036/
我正在尝试使用我正在调用的函数构建一个 vector vector CompPop() .我想返回类型为 vector 的 vector 信息.下面是我的函数代码,用于返回我的 Competition
在“AmDocs”最近组织的比赛中,我遇到了以下问题:(问题的基本思路) 给定一个大小固定为 12x12 的矩阵。给定六个长度为 6、5、5、4、3、2 的线段。矩阵有空的空间和填充的空间。您必须返回
当一个线程等待一个条件变量时,关联的互斥锁被(原子地)释放(解锁)。当该条件变量(由不同的线程)发出信号时,一个(对于信号)或所有(对于广播)等待线程被唤醒,自动重新获取(锁定)互斥量。 如果一个或多
我将参加 OBI(巴西信息学奥林匹克竞赛,英语),并且我正在尝试过去几年的一些练习。但是我找不到这个练习的解决方案(我翻译了它,所以可能有一些错误): Chocolate Competition Ca
我试图理解 Steven Halim 和 Felix Halim 的书 Competitive Programming 中的“凸包”算法。 “凸包”问题是,给定平面中 n 个点的集合 P,找到一个子集
我试图在远程 Kaggle 内核中使用 Python 模块,但是当我运行 from kaggle.competitions import nflrush 时,出现了这个错误: Could not fi
我正在尝试将 Z3 与 c++ api(版本 Z3 4.1.0.0)一起使用,即我正在尝试解析来自 smt-competition unsat 核心轨道的实例。我(根据示例)编写了以下代码: cont
最近我参加了一个编码挑战,但我只得到了 50% 的分数。很少有测试用例在执行我的代码时失败,我无法找到代码失败的原因。所以我在下面添加了问题和我的代码。感谢您帮助找到测试用例失败的原因。 要求 Com
我是 kaggler 的新兵。 我 fork 一个开放的内核并提交,当我提交我的输出时,按钮 Submit to Competition不工作,以及“您的内核无法使用互联网访问来参加本次比赛”的信息。
我正在研究一些数据结构,我注意到这是一个时间复杂度: O(log(log(n))))-竞争性。 我读到持续竞争是预期时间/最佳时间的比率。但是,拥有一套竞争力意味着什么? 最佳答案 在线算法是一种事先
我正在尝试从 Kaggle 竞赛中下载数据 state-farm-distracted-driver-detection 数据集具有以下目录结构 |-driver_imgs_list.csv |-sa
我正在尝试从 kaggle 比赛中下载数据,但我遇到了标题问题。我已经搜索过,我知道问题是我正在尝试为 kaggle 内核而不是本地内核运行它,但我不知道如何解决这个问题。我知道这是一个愚蠢的问题,但
我刚刚开始使用 OpenCL 1.2 和 C++ 绑定(bind)。我想将写入缓冲区异步排队并在操作完成后获取回调。这是相关代码行的精简版本: cl::Event enqueuingBufferRea
我是一名优秀的程序员,十分优秀!