傳送門
題目分析:
對於只含有0和1的二維網路,題目實際上問的是二維網路中連通著的'1'的塊數(這裡的連通只能是上下左右連通)。那麼,我們可以遍歷二維網路,對於陸地(由'1'構成),搜尋與其向連的'1'(陸地),$numisland$加一,當搜尋完一塊兒陸地(連著的'1')後,一定將他們變為'0',避免重複。
基於上述思想,做法有很多,比如搜尋時用$bfs$和$dfs$均可,只不過$dfs$用遞迴實現,而$bfs$用佇列實現。除此之外,也可以考慮用並查集實現相關連通塊兒的合併,最後統計根節點的數目就行了。
方法一、深度優先搜尋$dfs$
classsolution }}
return
num_island;
}void dfs(vectorchar>>& grid, int x, int
y) , dy[4] = ;
grid[x][y] = '
0'; //
避免重複遍歷
//深度優先搜尋(迭代)
for(int i = 0; i < 4; i++)
}};
方法二、廣度優先搜尋$bfs$
#include usingnamespace
std;
int dx[4] = ;
int dy[4] = ;
class
solution );
while(!neighbors.empty()) );
grid[xx][yy] = '0'
; }}
}}}}
}return
num_island;
}};
方法三、並查集
#include usingnamespace
std;
int dx[4] = ;
int dy[4] = ;
int par[100005
];int rak[100005
];class
solution
}int find(int x)
void unite(int x, int
y) }
int numislands(vectorchar>>&grid) }}
}for(int i = 0; i < row; i++)
}return
num_island;
}};
力扣 200 島嶼數量
給你乙個由 1 陸地 和 0 水 組成的的二維網格,請你計算網格中島嶼的數量。島嶼總是被水包圍,並且每座島嶼只能由水平方向和 或豎直方向上相鄰的陸地連線形成。此外,你可以假設該網格的四條邊均被水包圍。解題思路 dfs函式的作用 找到包含grid i j 格仔的島嶼的全部格仔,並將其全部置為 2 已訪...
力扣 200 島嶼數量(js)
給你乙個由 1 陸地 和 0 水 組成的的二維網格,請你計算網格中島嶼的數量。島嶼總是被水包圍,並且每座島嶼只能由水平方向或豎直方向上相鄰的陸地連線形成。此外,你可以假設該網格的四條邊均被水包圍。示例 1 輸入 1 1 1 1 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 輸出 1...
力扣Leetcode 200 島嶼數量
給你乙個由 1 陸地 和 0 水 組成的的二維網格,請你計算網格中島嶼的數量。島嶼總是被水包圍,並且每座島嶼只能由水平方向和 或豎直方向上相鄰的陸地連線形成。此外,你可以假設該網格的四條邊均被水包圍。輸入 11110 11010 11000 00000 輸出 1輸入 11000 11000 0010...