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

2019-03-16  本文已影响0人  余生筑
/*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
上一篇下一篇

猜你喜欢

热点阅读