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