connected_components = []
component_by_pos = {p: None for p in OBSTACLES}
unclaimed = positions - OBSTACLES
while len(unclaimed) > 0:
open_set = {unclaimed.pop()}
closed_set = set()
component = len(connected_components)
while len(open_set) > 0:
current = open_set.pop()
closed_set.add(current)
component_by_pos[current] = component
unclaimed.discard(current)
for neighbor in cardinal_neighbors(current):
if neighbor in OBSTACLES or neighbor in closed_set:
continue
open_set.add(neighbor)
connected_components.append(closed_set)