【发布时间】:2014-03-18 09:31:12
【问题描述】:
我正在尝试解决编程挑战,但只成功了一部分;我需要优化解决方案 - 这就是 你 的用武之地。首先,参数:
- 给你一些线段
int x1, y1, x2, y2。 - 您将获得球的起点
int px, py = INT_MAX。 - 您将模拟一个球从
px, py直接向下“掉落”(y 值较小)- 当它与一条线相交时,它会沿着这条线直到它的下端点
- 当没有更多的线相交时,输出
px。
所以,我的想法是:
- 将行读入行元组列表
int xtop, ytop, xbot, ybot, - 按
ybot对行进行排序。这使我们可以跳过球已通过的线, - 跟踪索引
imin使得所有i < imin的lines[i].ybot >= py,然后直到没有找到相交:- 最大化垂直相交
yi = kx + m, - 设置
px, py = lines[i].{x, y}bot。
- 最大化垂直相交
问题是这个时间复杂度 ∈ θ(n2) - IOW,大输入很糟糕。
一个想法是使用k-d tree 之类的东西,但问题是计算哪些行进入哪些所谓的半空间是否不会很昂贵。
【问题讨论】:
-
线条不能相交,对吗?
-
只需在不可见的上下文中绘制线条,然后放下球。然后检查球是否在具有线条颜色的像素上(检查球的实际位置的颜色(也是邻居)),它是相交的。 O(1)
-
"它沿着这条线直到它的下端点。"然后它又开始直线下降了吗?还是继续沿袭上一条路线?还有什么?
-
@DavidEisenstat,他们确实不能相交。
-
@JimMischel 他们直接往下掉。
标签: c performance algorithm optimization game-physics