1. 程式人生 > 其它 >LeetCode 695. 島嶼的最大面積 廣度優先搜尋

LeetCode 695. 島嶼的最大面積 廣度優先搜尋

LeetCode 695. 島嶼的最大面積 廣度優先搜尋

1.題目

給你一個大小為 m x n 的二進位制矩陣 grid 。

島嶼 是由一些相鄰的 1 (代表土地) 構成的組合,這裡的「相鄰」要求兩個 1 必須在 水平或者豎直的四個方向上 相鄰。你可以假設 grid 的四個邊緣都被 0(代表水)包圍著。

島嶼的面積是島上值為 1 的單元格的數目。

計算並返回 grid 中最大的島嶼面積。如果沒有島嶼,則返回面積為 0 。

2.思路

此題同200. 島嶼數量的思路一致,對於圖中的每個點,如果為 1,則代表是一個島嶼,此時通過廣度優先搜尋,遍歷此點四個方向相連線的所有的“陸地”。遍歷過程中,我們使用一個同圖相同大小的矩陣儲存元素的訪問狀態,在遍歷時跳過以及訪問過的點。

遍歷時,如果某個點為‘1’,且未被訪問過,代表著這個點是一個新的島嶼,在進行bfs計算面積,每次有一個點加入,面積加1.

3.Code

class Solution {
public:
    vector<vector<int>> visited;
    int res;
    int row;
    int col;
    int maxAreaOfIsland(vector<vector<int>>& grid) {
        row=grid.size();
        col=grid[0].size();
        vector<vector<int>> vis(row,vector<int>(col,0));
        visited=vis;
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(visited[i][j]!=1 && grid[i][j]==1){
                    res=max(bfs(i,j,grid),res);
                }
            }
        }
        return res;
    }
    int bfs(int i,int j,vector<vector<int>>& grid){
        int cur=1;
        visited[i][j]=1;
        //下
        if(i<row-1 && grid[i+1][j]==1 && visited[i+1][j]==0){
            cur+=bfs(i+1,j,grid);
        }
        //上
        if(i>0 && grid[i-1][j]==1 && visited[i-1][j]==0){
            cur+=bfs(i-1,j,grid);
        }
        //右
        if(j<col-1 && grid[i][j+1]==1 && visited[i][j+1]==0){
            cur+=bfs(i,j+1,grid);
        }
        //左
        if(j>0 && grid[i][j-1]==1 && visited[i][j-1]==0){
            cur+=bfs(i,j-1,grid);
        }
        return cur;
    }
};