在乙個矩形網格中每乙個格仔的顏色或者為白色或者為黑色。任意或上、或下、或左、或右相鄰同為黑色的格仔組成乙個家族。家族中所有格仔的數量反映家族的大小。要求找出最大家族的家族大小(組成最大家族的格仔的數量)並統計出哪些點屬於哪一族。例如下圖中最大家族的格仔數量為 8。
遍歷矩形網格,找到乙個沒有被標記的黑塊作為入口進行上下左右的搜尋並不斷的擴散,每找到乙個就進行族標記,最後輸出相應的族標記即可,使用深度優先演算法來做搜尋比較簡單。
#!/usr/bin/python
#encoding=utf8
table = [[0,0,1,0,1,1,1,0],
[0,0,1,0,0,1,1,0],
[0,1,1,0,1,1,1,0],
[0,0,1,0,1,0,0,0],
[0,0,0,0,0,1,1,0],
[0,0,0,0,1,1,1,0]]
rows =len(table)
cols =len(table[0])
label_table =
for i in
range(rows):
col = cols*[0]
defshow(table):
rows =len(table)
cols =len(table[0])
for i in
range(rows):
for j in
range(cols):
print(table[i][j], end="")
()def
dfs(i, j, mask):
if i<0 or i>=rows or j<0 or j>=cols or
\ label_table[i][j]!=0 or
\ table[i][j]!=1:
return
0 label_table[i][j] =mask
ret = 1
#left right up down search
ret+=dfs(i, j-1, mask)
ret+=dfs(i, j+1, mask)
ret+=dfs(i-1, j, mask)
ret+=dfs(i+1, j, mask)
return
ret
if__name__ == "
__main__":
print("
original table:")
show(table)
res={}
print("
++++++++++++++++++++")
print("
label table")
mask = 1
for i in
range(rows):
for j in
range(cols):
if table[i][j] == 1 and label_table[i][j] ==0:
ret =dfs(i,j, mask)
res[mask] =ret
mask+=1show(label_table)
print("
++++++++++++++++++++")
print("
results:")
sorted_res = [(k, res[k]) for k in sorted(res, key=res.get, reverse=true)]
max_grp =sorted_res[0][0]
print("
max group num: %d
"%sorted_res[0][1])
for i in
range(rows):
for j in
range(cols):
if label_table[i][j] ==max_grp:
print("
point (%d, %d) belongs to max group: %d
"%(i,j,max_grp))
#output
#original table:
#0 0 1 0 1 1 1 0
#0 0 1 0 0 1 1 0
#0 1 1 0 1 1 1 0
#0 0 1 0 1 0 0 0
#0 0 0 0 0 1 1 0
#0 0 0 0 1 1 1 0
#++++++++++++++++++++
#label table
#0 0 1 0 2 2 2 0
#0 0 1 0 0 2 2 0
#0 1 1 0 2 2 2 0
#0 0 1 0 2 0 0 0
#0 0 0 0 0 3 3 0
#0 0 0 0 3 3 3 0
#++++++++++++++++++++
#results:
#max group num: 9
#point (0, 4) belongs to max group: 2
#point (0, 5) belongs to max group: 2
#point (0, 6) belongs to max group: 2
#point (1, 5) belongs to max group: 2
#point (1, 6) belongs to max group: 2
#point (2, 4) belongs to max group: 2
#point (2, 5) belongs to max group: 2
#point (2, 6) belongs to max group: 2
#point (3, 4) belongs to max group: 2
用DFS(深度優先遍歷)解決可達性 連通性問題
解題思路 從乙個節點出發,使用 dfs 對乙個圖進行遍歷時,能夠遍歷到的節點都是從初始節點可達的,每趟從初始節點開始,需要把可以到達的位置做標記,並且標記後不需要更改,當走不通時返回,再尋找下乙個節點進行遍歷。leetcode上典型題目應用 695 查詢最大的連通面積 200 矩陣中的連通分量數目 ...
深度優先搜尋(DFS)求解迷宮問題
給乙個n行m列的2維的迷宮,s 表示迷宮的起點,t 表示迷宮的終點,表示不能通過的點,表示可以通過的點。你需要從 s 出發走到 t 每次只能上下左右走動,並且只能進入能通過的點,每個點只能通過一次。現在要求你求出有多少種通過迷宮的的方案。輸入格式 第一行輸入n,m 1 n,m 10 表示迷宮大小。接...
深度優先 遞迴方法 求解n皇后問題
這裡我用乙個類來模擬整個問題求解過程。問題的核心部分 怎樣儲存n個皇后,另乙個是如何判別當前位置的皇后能否插入到棋盤中 針對這兩個問題,可以採取用遞迴的方法解決。首先可以用乙個維位陣列 來儲存每一行皇后放置的 列數 另外就是要了解到使用乙個判別式,來判別當前要插入的位置是否處在 已經插入的皇后的對角...