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