BFS判断连通性-S276求矩阵块数

/*BFS实现*/
#include <iostream>
#include<queue>
using namespace std;
const int MAXV=100;//定义const量
struct node//定义结构体
{
    int x,y;
} Node;
int N,M;
int G[MAXV][MAXV];
bool vest[MAXV][MAXV];//inque[i][j]为true,则表示该点曾经入队
int go[4][2]={0,1,0,-1,1,0,-1,0};//4向数组
bool judge(int i,int j)
{
    if(i<0||i>=N||j<0||j>=M||vest[i][j]||G[i][j]==0)//在遍历矩阵块时才需要判断边界
        return false;
    return true;
}
void BFS(int i,int j)
{
    queue<node> que;
    Node.x=i;
    Node.y=j;
    que.push(Node);
    vest[i][j]=true;
    while(!que.empty())
    {
    node top=que.front();
    que.pop();
    for(int i=0; i<4; i++)
    {
        Node.x=top.x+go[i][0];
        Node.y=top.y+go[i][1];
        if(judge(Node.x,Node.y))
        {
            que.push(Node);
            vest[Node.x][Node.y]=true;
        }
    }
    }
}
int main()
{
    fill(vest[0],vest[0]+MAXV*MAXV,false);

    for(int i=0; i<MAXV; i++)
    {
        for(int j=0; j<MAXV; j++)
        {
            vest[i][j]=false;
        }
    }

    cin>>N>>M;
    for(int i=0; i<N; i++)
    {
        for(int j=0; j<M; j++)
        {
            cin>>G[i][j];
        }
    }

    int cnt=0;
    for(int i=0; i<N; i++)
    {
        for(int j=0; j<M; j++)
        {
            //挑选未被遍历的矩阵块的起点
            if(G[i][j]==1&&vest[i][j]==false)
            {
                cnt++;
                BFS(i,j);
            }
        }
    }

    cout<<cnt<<endl;
    return 0;
}

/*输入:6 7
0 1 1 1 0 0 1
0 0 1 0 0 0 0
0 0 0 0 1 0 0
0 0 0 1 1 1 0
1 1 1 0 1 0 0
1 1 1 1 0 0 0
输出:4
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容