BFS入门导引
/*void BFS(int s){
queue
q.push(s);
while(!q.empty()){
//取出队首元素top;
//访问队首元素top;
//将队首元素出队
//将top的下一层结点中未曾入队的结点全部入队,并设置为已入队;
}
}
步骤:
(1) 定义队列q,并将起点s入队
(2) 写一个while循环,循环条件是队列非空
(3) 在while循环中,先取出队首元素top,然后访问它(访问可以是任何事情,例如将其输出)
(4) 将top的下一层结点中所有未曾入队的结点入队,并标记他们的层号为now的层号加1,同
时设置这些入队的结点已入队
(5)返回(2)继续循环
设置两个增量数组,表示四个方向(竖着看即为(0,1),(0,-1),(1,0),(-1,0))
int X[]={0, 0, 1, -1};
int Y[]={1,-1, 0, 0};
这样就可以使for循环来枚举4个方向,以确定与当前坐标(nowX,nowY)相邻的4个位置
for(int i=0;i<4;i++){
newX = nowX + X[i];
newY = nowY + Y[i];
} */
include
include
using namespace std;
const int maxn = 100;
struct node{
int x,y;//位置x,y
}Node;
int n,m;
int matrix[maxn][maxn];
bool inq[maxn][maxn] = {false};
int X[4] = {0,0,1,-1};
int Y[4] = {1,-1,0,0};
bool judge(int x,int y){//判断坐标(x,y)是否需要访问
//越界返回false
if(x>=n||x<0||y>=m||y<0) return false;
//当前位置为0,或(x,y)已入过队,返回false
if(matrix[x][y]0||inq[x][y]true) return false;
return true;
}
//BFS函数访问位置(x,y)所在的块,将该块中所有的"1"的inq都设置为true
void BFS(int x,int y){
queue
Node.x = x,Node.y = y;//当前结点的坐标为(x,y)
Q.push(Node);//将结点Node入队
inq[x][y] = true;//设置(x,y)已入过队
while(!Q.empty()){
node top = Q.front();//取出队首元素
Q.pop();//队首元素出队
for(int i=0;i<4;i++){//循环4次,得到4个相邻的位置
int newX = top.x+X[i];
int newY = top.y+Y[i];
if(judge(newX,newY)){//如果新的位置(newX,newY)需要访问
//设置Node的坐标为(newX,newY)
Node.x = newX,Node.y=newY;
Q.push(Node);//将结点Node加入队列
inq[newX][newY]=true;//设置位置(newX,newY)已入过队
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int x = 0; x < n; x++)
for(int y = 0;y<m;y++)
scanf("%d",&matrix[x][y]);//读入
int ans = 0;//存放块数
for(int x=0;x<n;x++)//枚举每一个位置
for(int y=0;y<m;y++)
if(matrix[x][y] == 1&& inq[x][y] == false){
ans++;
BFS(x,y);//访问整个块,将该块所有"1"的inq都标记为true
}
printf("%d\n",ans);
return 0;
}