今天的題目給出一個用文字表示的圖形,當中 1 表示陸地,0 表示海水。相鄰的 1 (上下相鄰或左右相鄰都算)會組成一大塊島嶼,我們要找出的是,題目中共有幾座不相鄰的島嶼。
這個題目用肉眼看很好解,但演算法就稍微複雜。本題的做法是用 DFS 搜索,當找到陸地時,就會偵測他的上下左右還有沒有陸地,如果發現陸地,便打上記號,並繼續搜尋這塊陸地的四周,直到再也找不到為止,然後進入下一個點繼續搜尋。這樣一來,相鄰的陸地會在第一次就被找到並且做上標記,當第二次找到時,會知道已經來過了,因此不會重複計算。
明天沒有意外的話,預計會繼續寫這種類型的題目,可以的話會試著比較 DFS 和 BFS 的不同。今天這題其實有看了 BFS 的解法,但我覺得概念和 DFS 太像難以分辨差別,所以就不附上了QQ
// javascript
// DFS
var numIslands = function(grid) {
if (!grid || grid.length == 0) return 0;
const row = grid.length
const col = grid[0].length;
let num = 0;
var dfs = function(i, j) {
if (i < 0 || i >= row || j < 0 || j >= col || grid[i][j] === '0') return;
grid[i][j] = '0';
dfs(i - 1, j);
dfs(i + 1, j);
dfs(i, j - 1);
dfs(i, j + 1);
}
for (var i = 0; i < row; i++) {
for (var j = 0; j < col; j++) {
if (grid[i][j] === '1') {
num++;
dfs(i, j);
}
}
}
return num;
};