1 回答
TA贡献1810条经验 获得超5个赞
有关错误的详细信息,请参阅 https://stackoverflow.com/a/38423075。基本上,如果要在循环中修改该集合,则必须循环访问该集合的副本。
除此之外,您的算法中还存在一个缺陷。
如果不丢弃当前字符,则仅当每个字符都有邻居时才进行检查。这是可以的:
xxxxx
xoxox
xoxox
xxxxx
但是,如果您丢弃当前字符,则可能会有以下情况:
xxx xxx
xox <- cur x x <- discarded
xox xox <- has no neighbor!
xxx xxx
经典算法基于树遍历:从任何 not 开始,遍历所有直接链接的节点。如果看到所有节点,则图形已连接。
我在这里使用DFS,但如果你愿意,你可以使用BFS:
def connected(characters):
seen = set()
stack = [next(iter(characters))] if characters else []
while stack:
c = stack.pop()
seen.add(c)
for other_c in [(c[0]+1, c[1]), (c[0]-1, c[1]), (c[0], c[1]+1), (c[0], c[1]-1)]:
if other_c not in seen and other_c in characters:
stack.append(other_c)
return not (characters - seen)
print(connected({(1, 3), (2, 1), (2, 3), (0, 3), (1, 1)}))
# False
print(connected({(1, 3), (2, 1), (2, 3), (0, 3), (1, 1), (1, 2)}))
# True
添加回答
举报