1
A
回答
4
+1
+1時間複雜度最優:O(mn) – 2010-08-01 19:26:18
0
您可以使用Depth-first search算法。該算法可以在時間O(E)中找到任意無向圖中連通分量的數量,其中E是圖中邊的數量。在網格上你有O(nm)邊緣,因爲每個頂點至多有四個鄰居。
2
當然,這種問題的良好數據結構(「確定連接組件的數量」)是UnionFind數據結構;它會產生接近線性(網格大小)的算法。但事實證明,針對您的具體問題,這讓人想起休閒編程挑戰中的迷宮練習,這裏有一個更原始的,甚至更好的(線性)解決方案。
(我的道歉湯姆,因爲我認爲這是你所追求的,但填注是這樣一個通用的技術,我想這可能會承擔一些細節!)
你點顏色每個連接的區域具有不同的顏色。我們的想法是,要做到這一點,您只需要跟蹤如何爲網格的最後一條加工線着色。訣竅是知道(a)選擇什麼顏色和(b)如何計算不同的連接區域。
def countConnectedAreas(grid, n):
vector = [0] * n # Buffer vector containing current zones.
count = 0 # Current number of connected areas.
nextToken = 1 # Next color to use to paint a newly encountered zone.
for line in grid:
current = 0
for i in range(n):
if not line[i]:
# Not dot.
current = 0
else:
# There is a dot.
if current != 0 and vector[i] != 0 and current != vector[i]:
# This is the tricky case: it means you can paint the next
# square with two colors, which means that two connected
# areas are merging. Automatically, this means that you are
# seeing one less connected area.
count -= 1
else:
current = max(current, vector[i])
if current == 0:
# If the neighboring squares are colored 0, then pick a new
# color.
current = nextToken
nextToken += 1
count += 1
vector[i] = current
return count
這裏有幾個電網嘗試了這一點上:
gridOne = [
[ True, True, False, False, False, False, True ],
[ True, True, False, False, False, False, True ],
[ True, True, False, True, True, False, True ],
[ True, True, False, False, True, False, True ],
[ True, True, False, False, False, False, True ],
[ False, True, False, False, False, False, True ],
[ False, True, True, False, False, False, True ],
[ True, False, True, False, False, False, True ] ]
gridTwo = gridOne + [
[ True, True, True, True, True, True, True] ]
countConnectedAreas(gridOne, 7) # returns 4
countConnectedAreas(gridTwo, 7) # returns 2
相關問題
- 1. 如何計算網格中連接的單元格?
- 2. 計算網絡中連接數最多的節點R igraph
- 3. 在連接中計算列
- 4. 二維網格中的連接點
- 5. 用線連接網格中的點
- 6. 計算網格的頂點法線
- 7. 網格點算法(發現在網格中的點)
- 8. 在SQL中連接計算的字段
- 9. N維網格頂點計算
- 10. 在javascript中計算網格的座標?
- 11. 在具有多個檢查點的網格中計算路徑
- 12. 在DevExpress網格計算
- 13. Mysql連接計算
- 14. 網格計算API
- 15. Javascript網格計算
- 16. 網格內計算
- 17. 如何在Firebase中計算連接
- 18. 計算WebSocket連接的Ping?
- 19. 如何在無限計算網格中專用節點
- 20. 替換頂點以連接網格
- 21. 硒網格連接節點列表
- 22. 用Java計算完全連接的網狀拓撲網絡數
- 23. 我可以直接在Extjs網格中計算字段嗎?
- 24. 如何計算網卡在Android上打開連接的時間
- 25. 計算N維網格中點之間的路徑數量?
- 26. 計算連接中返回的行數
- 27. 計算網格中的物種發生
- 28. 網格中塊的寬度計算
- 29. 如何計算網格中的重心?
- 30. 在浮點計算中點
網格大小的任何限制?對於小型電網最有效的算法將(可能)不是大型電網最有效的算法。 – 2010-08-01 16:04:16
連接是什麼意思?如果兩個點都打開並且相鄰是一個連接? – deinst 2010-08-01 16:04:36
沒有限制,我目前有40x50的網格。 如果點形成一條線,它將被計爲一條。 – Santosh 2010-08-01 16:47:38