lintcode 433岛屿的个数

题目:

给一个01矩阵,求不同的岛屿的个数。

0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。

样例:

思路:

根据提示,因为上下左右有1表示为一个岛,我们可以用深度优先遍历来解决。当遍历到“1”时,递归判断周围是否有“1”,若有,继续遍历;反之,则将已经遍历的部分全部置为0,然后继续遍历下一个点。代码如下(C++):

class Solution {
public:
    /**
     * @param grid a boolean 2D matrix
     * @return an integer
     */
    int numIslands(vector<vector<bool>>& grid) {
        if (grid.empty())
            return 0;

        int cnt = 0;

        for (int i = 0; i < grid.size(); i++)
        {
            for (int j = 0; j < grid.at(0).size(); j++)
            {
                if (1 == grid[i][j])
                {
                    cnt++;
                    grid[i][j] = 0;
                    if (i > 0 && grid[i - 1][j])
                    {
                        numIslandsCore(grid, i - 1, j);
                    }
                    if (j > 0 && grid[i][j - 1])
                    {
                        numIslandsCore(grid, i, j - 1);
                    }
                    if (i < grid.size() - 1 && grid[i + 1][j])
                    {
                        numIslandsCore(grid, i + 1, j);
                    }
                    if (j < grid.at(0).size() - 1 && grid[i][j + 1])
                    {
                        numIslandsCore(grid, i, j + 1);
                    }
                }
            }
        }
        return cnt;
    }

    void numIslandsCore(vector<vector<bool> > &grid, int i, int j)
    {
        //cout << i << j << endl;
        grid[i][j] = 0;
        if (i > 0 && grid[i - 1][j])
        {
            numIslandsCore(grid, i - 1, j);
        }
        if (j > 0 && grid[i][j - 1])
        {
            numIslandsCore(grid, i, j - 1);
        }
        if (i < grid.size() - 1 && grid[i + 1][j])
        {
            numIslandsCore(grid, i + 1, j);
        }
        if (j < grid.at(0).size() - 1 && grid[i][j + 1])
        {
            numIslandsCore(grid, i, j + 1);
        }
        
        return;
    }
};

 

posted @ 2017-08-10 23:50  Minec  阅读(500)  评论(0)    收藏  举报