LeetCode200 島嶼數量

給定一個由 '1'(陸地)和 '0'(水)組成的的二維網格,計算島嶼的數量。一個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連接而成的。你可以假設網格的四個邊均被水包圍。

示例 1:

輸入:
11110
11010
11000
00000

輸出: 1
示例 2:

輸入:
11000
11000
00100
00011

輸出: 3

思路:兩種方法DFS和BFS

void BFS(vector<vector<char>>&mark,vector<vector<char>>&grid,int x,int y){
        static const int dx[]={-1,1,0,0};
        static const int dy[]={0,0,-1,1};
        queue<pair<int,int>> Q;
        Q.push(make_pair(x,y));
        mark[x][y]=1;
        while(!Q.empty()){
            x=Q.front().first;
            y=Q.front().second;
            Q.pop();
            for(int i=0;i<4;i++){
                int newx=dx[i]+x;
                int newy=dy[i]+y;
                if(newx<0||newx>=mark.size()||newy<0||newy>=mark[newx].size()){
                    continue;
                }
                if(mark[newx][newy]==0&&grid[newx][newy]==1){
                    Q.push(make_pair(newx,newy));
                    mark[newx][newy]=1;
                }
            }
        }
    }
void DFS(vector<vector<char>>&mark,vector<vector<char>>&grid,int x,int y){
        mark[x][y]='1';
        static const int dx[]={-1,1,0,0};
        static const int dy[]={0,0,1,-1};
        for(int i=0;i<4;i++){
            int newx=x+dx[i];
            int newy=y+dy[i];
            if(newx<0||newx>=mark.size()||newy<0||newy>=mark.size()){
                continue;
            }
            if(grid[newx][newy]=='1'&&mark[newx][newy]=='0'){
                DFS(mark,grid,newx,newy);
            }
        }
    }
int numIslands(vector<vector<char>>& grid) {
        vector<vector<char>> mark;
        int block=0;
        for(int i=0;i<grid.size();i++){
            mark.push_back(vector<char>());
            for(int j=0;j<grid[i].size();j++){
                mark[i].push_back('0');
            }
        }
        for(int i=0;i<grid.size();i++){
            for(int j=0;j<grid[0].size();j++){
                if(grid[i][j]=='1'&&mark[i][j]=='0'){
                    DFS(mark,grid,i,j);
                    block++;
                }
            }
        }
        return block;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章