1 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超5個(gè)贊
有關(guān)錯(cuò)誤的詳細(xì)信息,請(qǐng)參閱 https://stackoverflow.com/a/38423075。基本上,如果要在循環(huán)中修改該集合,則必須循環(huán)訪問(wèn)該集合的副本。
除此之外,您的算法中還存在一個(gè)缺陷。
如果不丟棄當(dāng)前字符,則僅當(dāng)每個(gè)字符都有鄰居時(shí)才進(jìn)行檢查。這是可以的:
xxxxx
xoxox
xoxox
xxxxx
但是,如果您丟棄當(dāng)前字符,則可能會(huì)有以下情況:
xxx xxx
xox <- cur x x <- discarded
xox xox <- has no neighbor!
xxx xxx
經(jīng)典算法基于樹(shù)遍歷:從任何 not 開(kāi)始,遍歷所有直接鏈接的節(jié)點(diǎn)。如果看到所有節(jié)點(diǎn),則圖形已連接。
我在這里使用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
添加回答
舉報(bào)