岛屿问题

来源:互联网 发布:如何加强网络空间安全 编辑:程序博客网 时间:2024/04/29 09:14

题目

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

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

思路

遍历,然后为1 改为0,检查周边,注意判断是否可以+、-1,是否为边界
递归遍历周围

ps: 这里表面上先对于某一个值为1的点,先遍历四周,还是先置为0,貌似是一样的;但是在实际代码实现的时候,这二者是有区别的。
对于有值为1的点相邻的情况下,如果是先递归寻找的话,会导致下一层的递归找到的点是原来找过的。会造成循环递归,而没有终止条件,最终导致内存溢出,导致程序崩溃。
先将找到的点置为0就不会有上述问题的存在。

代码

#include<stdio.h>void IslandsCore(int (&grid)[5][5], int i, int j,int m,int n){    grid[i][j]=0;    if(i>1&&grid[i-1][j]==1)        IslandsCore(grid,i-1,j,m,n);    if(j>1&&grid[i][j-1]==1)        IslandsCore(grid,i,j-1,m,n);    if((i<m-1)&&grid[i+1][j]==1)        IslandsCore(grid,i+1,j,m,n);    if((j<n-1)&&grid[i][j+1]==1)        IslandsCore(grid,i,j+ 1,m,n);}int numsofIslands(int (&grid)[5][5], int m, int n){    int cnt=0;    for (int i = 0;i<m;i++)    {        for(int j = 0;j<n;j++)        {            if(grid[i][j]==1)            {                grid[i][j]=0;                printf("i:%d,j:%d, --- %d\n",i,j,grid[i][j]);                cnt++;                if(i>1&&grid[i-1][j]==1)                    IslandsCore(grid,i-1,j,m,n);                if(j>1&&grid[1][j-1]==1)                    IslandsCore(grid,i,j-1,m,n);                if((i<m-1)&&grid[i+1][j]==1)                    IslandsCore(grid,i+1,j,m,n);                if((j<n-1)&&grid[i][j+1]==1)                    IslandsCore(grid,i,j+1,m,n);            }        }    }    return cnt;} int main(){    // 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    int grid[5][5]={{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}};    int cnt = numsofIslands(grid,5,5);    printf("%d\n",cnt);}
0 0
原创粉丝点击