zoukankan      html  css  js  c++  java
  • 433 岛屿的个数

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

     

    本题还可以用递归的方法来解决,都是深度优先搜索,递归的代码更简洁。

    思路:二重循环遍历数组的每个点,如果值为true,计数器加1,然后判断该点的上下左右,如果上下左右某个点也为true,将其置为false,继续遍历这个点的上下左右……

     

     代码:

    void dfsInl(vector<vector<bool>> &grid,int i,int j)
    {
        if (i<0||j<0||i>(int)grid.size()-1||j>(int)grid[0].size()-1)
        {
            return ;
        }
        if (grid[i][j]==true)//最开始没加这个判断导致栈溢出,蠢哭;
        {
            grid[i][j]=false;
            dfsInl(grid,i-1,j);
            dfsInl(grid,i+1,j);
            dfsInl(grid,i,j-1);
            dfsInl(grid,i,j+1);
        }
    
    }
    
    int numIslands(vector<vector<bool>> &grid)
    {
        int row=grid.size();
        if (row==0)
        {
            return 0;
        }
        int col=grid[0].size();
        if (col==0)
        {
            return 0;
        }
        int result=0;
        for (int i=0;i<row;i++)
        {
            for (int j=0;j<col;j++)
            {
                if (grid[i][j]==true)
                {
                    result++;
                    dfsInl(grid,i,j);
                }
            }
        }
        return result;
    }

     

     

    参考:https://blog.csdn.net/u012762106/article/details/47866221

    https://www.cnblogs.com/theskulls/p/4875599.html

    https://blog.csdn.net/linside1022/article/details/79403018

    https://blog.csdn.net/wutingyehe/article/details/47683513

  • 相关阅读:
    函数—函数进阶(二)
    函数—函数进阶(一)
    函数(三)
    函数(二)
    函数(一)
    人丑就要多读书、三元运算、文件处理
    第二章练习题
    Python bytes类型介绍、Python3与2字符串的区别、Python3与2编码总结
    进制运算、字符编码、Python3的执行流程
    去除inline-block元素间间距,比较靠谱的两种办法
  • 原文地址:https://www.cnblogs.com/Tang-tangt/p/9248195.html
Copyright © 2011-2022 走看看