433 岛屿的个数

匿名 (未验证) 提交于 2019-12-03 00:39:02

原题网址: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;          } };

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!