用Python在不使用炸弹的情况下在矩形区域中找到一条连续路径的程序
假设我们有一个数组mat,其中元素的形式为[p,q,r],其中p,q是几何坐标,r是半径值。数组中的项目是给定宽度w的矩形区域中炸弹的位置。矩形无限长,以x坐标x=0到x=w为界。炸弹位置中的r值表示炸弹的安全半径,这意味着任何小于炸弹半径的东西都会与它交战。所以,我们要做的是画一条连续的路径,从每颗炸弹下方开始,到每颗炸弹上方结束,而不与其中任何一个接触。如果我们能画这条线,我们将打印True,否则,我们打印False。
所以,如果输入像mat=
,w=4;那么输出将为False。
示例
让我们看看以下实现以获得更好的理解-
from bisect import bisect_left, insort def solve(mat, w): mat.sort(key=lambda i: i[0] - i[2]) temp = [] if mat[0][0] - mat[0][2] > 0: return True for p, q, r in mat: min_wid, max_wid = p - r, p + r if len(temp) == 0: temp.append([p + r, p, q, r, p - r, p + r]) else: mx = max(bisect_left(temp, [p - r, -p, q, r, 0, 0]) - 1, 0) in_list = [p + r, p, q, r, p - r, p + r] for i in range(mx, len(temp)): if insec(temp[i], in_list): max_wid = max(max_wid, temp[i][-1]) min_wid = min(min_wid, temp[i][-2]) in_list[-2] = min_wid in_list[-1] = max_wid insort(temp, in_list) if min_wid <= 0 and max_wid >= w: return False return True def insec(p, q): x1, y1, x2, y2 = p[1], p[2], q[1], q[2] r1, r2 = p[3], q[3] d = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) dec = (r1 + r2) * (r1 + r2) return d <= dec print(solve([[0, 1, 2],[3, 2, 1], [2, 1, 1]], 4))
输入
[[0, 1, 2],[3, 2, 1], [2, 1, 1]], 4输出结果
False