码迷,mamicode.com
首页 > 其他好文 > 详细

433 岛屿的个数

时间:2018-06-30 18:50:23      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:button   IV   遍历   mat   solution   turn   ber   com   处理   

原题网址:https://www.lintcode.com/problem/number-of-islands/description

描述

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

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

您在真实的面试中是否遇到过这个题?  

样例

在矩阵:

[
  [1, 1, 0, 0, 0],
  [0, 1, 0, 0, 1],
  [0, 0, 0, 1, 1],
  [0, 0, 0, 0, 0],
  [0, 0, 0, 0, 1]
]

中有 3 个岛.

 

思路:利用图像处理中区域生长的思想。

1.创建一个与grid相同大小值为0的矩阵tmp,用来保存生长后的结果。即tmp中同一个岛屿的坐标点对应数值一样。设置标签lable=0,该值记录岛屿编号。

2.遍历grid,如果当前点对应值为1且tmp相同点对应值为0,说明该点属于新岛屿,lable++,tmp=lable。同时,以该点为种子点进行4邻域生长。

3.生长过程借助栈,首先将上步种子点压入栈中。

如果种子点4邻域的某个点grid值为1且tmp值为0,说明该点待生长,将tmp赋值为lable,再将该点压入栈中。

重复上述生长过程直到栈为空,说明一个岛屿生长完毕。

最后返回lable。

 

AC代码:

class Solution {
public:
    /**
     * @param grid: a boolean 2D matrix
     * @return: an integer
     */
    int numIslands(vector<vector<bool>> &grid) {
        // write your code here
    int row=grid.size();
    if (row==0)
    {
        return 0;
    }
    int col=grid[0].size();
    if (col==0)
    {
        return 0;
    }
    vector<vector<int>> tmp(row,vector<int>(col,0));

    int neigb[4][2]={{0,-1},{-1,0},{0,1},{1,0}};
    stack<vector<int>> seedgrow;
    int lable=0;

    for (int i=0;i<row;i++)
    {
        for (int j=0;j<col;j++)
        {
            if (grid[i][j]==1&&tmp[i][j]==0)
            {
                lable++;
                tmp[i][j]=lable;
                vector<int> p;
                p.push_back(i);
                p.push_back(j);
                seedgrow.push(p);
                while(seedgrow.empty()==false)
                {
                    vector<int> seed=seedgrow.top();
                    seedgrow.pop();
                    for (int k=0;k<4;k++)
                    {
                        int x=seed[0]+neigb[k][0];
                        int y=seed[1]+neigb[k][1];
                        if ((x>=0&&x<row)&&(y>=0&&y<col))
                        {
                            if (grid[x][y]==1&&tmp[x][y]==0)//同时tmp[x][y]==0不可少,因为如果点(x,y)生长过了出现死循环;
                            {
                                tmp[x][y]=lable;
                                vector<int> newseed;
                                newseed.push_back(x);
                                newseed.push_back(y);
                                seedgrow.push(newseed);
                            }
                        }
                    }
                }
            }

        }
    }

    return lable;
    
    }
};

 

 

433 岛屿的个数

标签:button   IV   遍历   mat   solution   turn   ber   com   处理   

原文地址:https://www.cnblogs.com/Tang-tangt/p/9248195.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!