3.孤岛的总面积

题目描述

给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些位于矩阵内部、所有单元格都不接触边缘的岛屿。

现在你需要计算所有孤岛的总面积,岛屿面积的计算方式为组成岛屿的陆地的总数。

输入描述

第一行包含两个整数 N, M,表示矩阵的行数和列数。之后 N 行,每行包含 M 个数字,数字为 1 或者 0。

输出描述

输出一个整数,表示所有孤岛的总面积,如果不存在孤岛,则输出 0。

 

#include
#include

#include
int S=0;
using namespace std;
struct point{
    int x,y;
};
int n,m;
const int N =60;
int g[N][N];
 queue q;


int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
//定义方向向量,从顺时针
 bool vis[N][N]={false};
int bfs(int x,int y){
    vis[x][y]=true;
      int cnt=1;   bool flag=true;//默认是孤岛
        point *t=new point();
        t->x=x;
        t->y=y;
        q.push(t);
       
        
    while(!q.empty()){
        point *h=new point();
        h=q.front();
        q.pop();
        int x2=h->x;
        int y2=h->y;
        delete h;
        for(int i=0;i<4;i++){
           int  x1=x2+dir[i][0];
           int  y1=y2+dir[i][1];
            if(x1<1||x1>n||y1<1||y1>m){
                 flag=false;
                continue;
            }//如果他越界了本身就说明他与外部接壤。。所以直接就判定是孤岛
                
              
            if(!vis[x1][y1]&&g[x1][y1]==1){
                vis[x1][y1]=true;
                point *n1=new point();
                n1->x=x1;
                n1->y=y1;
                q.push(n1);
                cnt++;//面积加1
            }

        }

    }

     return flag?cnt:0;
    
 }
int main(){ 
     cin>>n>>m;
     int total=0;
     for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>g[i][j];
        }
     }
     
     for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(!vis[i][j]&&g[i][j]==1){
                
               int area=bfs(i,j);
                   
              total+=area;//把孤岛面积加起来
               
            }
        }
    }
   printf("%d",total);
    return 0;
}

这道题写了很多次,最后参考别人的代码,才找到自己的问题,就在于判断是不是孤岛那部分逻辑不正确

你可能感兴趣的:(代码随想录之图论题解,图论,算法,广度优先)