中级农民
- 积分
- 113
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2014-10-21
- 最后登录
- 1970-1-1
|
利用dfs或者union find做- def connect(p1, p2):
- return (p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2 <= (p1[2] + p2[2]) ** 2
-
- def lobound(p):
- return p[1] - p[2]
-
- def hibound(p):
- return p[1] + p[2]
-
- # O(n * n)
- def can_pass(pillars, lo, hi):
- from collections import defaultdict
- graph = defaultdict(set)
- for i in range(len(pillars)):
- if lobound(pillars[i]) <= lo and hibound(pillars[i]) >= hi:
- return False
- for j in range(i + 1, len(pillars)):
- if connect(pillars[i], pillars[j]):
- graph[i].add(j)
- graph[j].add(i)
-
- visit = set()
-
-
- def dfs(idx):
- stk = [(idx, lobound(pillars[idx]), hibound(pillars[idx]))]
- while stk:
- i, lb, hb = stk.pop()
- if i in visit:
- continue
- visit.add(i)
- if lb <= lo and hb >= hi:
- return False
- for nei in graph[i]:
- if nei in visit:
- continue
- stk.append((nei, min(lb, lobound(pillars[nei])), max(hb, hibound(pillars[nei]))))
- return True
-
- return all(dfs(i) for i in range(len(pillars)) if i not in visit)
复制代码 [/i][/i][/i][/i][/i]
|
|