LeetCode 200.岛屿的个数

给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。

示例 1:

输入:

11110
11010
11000
00000

输出: 1


示例 2:

输入:

11000
11000
00100
00011

输出: 3

 

和之前的DFS寻找最短路径不同,这道题没有了终点,所以不需要我们回退时,将点设置为可行。首先找到一个可行点,然后将这个可行点可以到达的地方全部感染,这就是一个岛。我们再搜寻是否有其他未感染可行点,继续感染。

#include <iostream>
#include <vector>

using namespace std;

int arr[4][2] = { 1, 0, -1, 0, 0, 1, 0, -1 };
void infact(vector<vector<char> >& grid, int i, int j) {
    if (i < 0 || i >= grid.size() || j < 0 || j >= grid[0].size() || grid[i][j] != '1') {
        return;
    }

    for (int k = 0; k < 4; ++k) {//上下左右全部都要搜寻完
        grid[i][j] = '2';
        int ni = i + arr[k][0];
        int nj = j + arr[k][1];
        infact(grid, ni, nj);
    }
}

int numIslands(vector<vector<char>>& grid) {
    int island = 0;
    for (size_t i = 0; i < grid.size(); ++i) {
        for (size_t j = 0; j < grid[0].size(); ++j) {
            if (grid[i][j] == '1') {
                infact(grid, i, j);
                ++island;
            }
        }
    }
    return island;
}

int main()
{
    vector<vector<char> >  map = {
    {'1','1','1','1','0'},
    {'1','1','0','1','0'},
    {'1','1','0','1','0'},
    {'0','0','1','0','1'}
    };

    cout << numIslands(map);

    system("PAUSE");
    return 0;
}
posted @ 2019-03-31 19:21  Hk_Mayfly  阅读(254)  评论(0编辑  收藏  举报