島嶼的最大面積
阿新 • • 發佈:2018-12-16
題目
給定一個包含了一些 0 和 1的非空二維陣列 grid , 一個 島嶼 是由四個方向 (水平或垂直) 的 1 (代表土地) 構成的組合。你可以假設二維矩陣的四個邊緣都被水包圍著。
找到給定的二維陣列中最大的島嶼面積。(如果沒有島嶼,則返回面積為0。)
示例 1:
[[0,0,1,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,1,1,0,1,0,0,0,0,0,0,0,0],
[0,1,0,0,1,1,0,0,1,0,1,0,0],
[0,1,0,0,1,1,0,0,1,1,1,0,0],
[0,0,0,0,0,0,0,0,0,0,1,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,0,0,0,0,0,0,1,1,0,0,0,0]]
對於上面這個給定矩陣應返回 6。注意答案不應該是11,因為島嶼只能包含水平或垂直的四個方向的‘1’。
示例 2:
[[0,0,0,0,0,0,0,0]]
對於上面這個給定的矩陣, 返回 0。
注意: 給定的矩陣grid 的長度和寬度都不超過 50。
我的思路
題很容易理解,關鍵在於解決問題的思維。此題,我採用的是DFS+遞迴。
參考
我的程式碼實現
// // Created by HINTS on 2018/12/13. // #include <iostream> #include <vector> using namespace std; //使用DFS(深度優先搜尋演算法)+遞迴實現 /** * * @param grid * @param x0:橫座標 * @param y0:縱座標 * @return */ int dfs(vector<vector<int >> &grid, int x0, int y0){ int n, m, sum = 1; //當前元素設為0,所以sum初始為1。 n = grid.size(); m = grid[0].size(); grid[x0][y0] = 0; //設定當前元素為0,以免再次搜尋到。 int dir[4][2] = {{0,1},{0,-1}, {1,0},{-1,0}}; //設定上下左右四個移動方向 for (int i = 0; i < 4; ++i) { //設定x,y 移動方向。 int x = x0 + dir[i][0]; int y = y0 + dir[i][1]; //設定邊界條件 if(x >= 0 && x < n && y >= 0 && y < m && grid[x][y] == 1){ sum += dfs(grid,x,y); } } return sum; } int maxAreaOfIsland(vector<vector<int>> &grid){ int mx = 0, n, m; //mx:面積 n = grid.size(); m = grid[0].size(); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if(grid[i][j] == 1){ mx = max(dfs(grid,i, j), mx); } } } return mx; } int main(){ vector<vector<int>> grid = {{0,0,1,0,0,0,0,1,0,0,0,0,0}, {0,0,0,0,0,0,0,1,1,1,0,0,0}, {0,1,1,0,1,0,0,0,0,0,0,0,0}, {0,1,0,0,1,1,0,0,1,0,1,0,0}, {0,1,0,0,1,1,0,0,1,1,1,0,0}, {0,0,0,0,0,0,0,0,0,0,1,0,0}, {0,0,0,0,0,0,0,1,1,1,0,0,0}, {0,0,0,0,0,0,0,1,1,0,0,0,0}}; int sum = maxAreaOfIsland(grid); cout << sum << endl; return 0; }