啊啊啊啊啊啊 我是激动粉٩(๑>◡<๑)۶ 妈诶 我看了好几天没看懂的bfs 居然今天弄懂了 虽然今天蓝桥还是不一定会写 但我还是很开心!!!!!!
#include <cstdio>
#include <queue>
using namespace std;
const int maxn = 100;
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){
if(x>=n||x<0||y>=m||y<0) return false;//越界返回false
if(matrix[x][y]==0||inq[x][y]==true) return false;//0不需要访问 已经入队的不需要访问
//其余情况返回true
return true;
}
struct node{
int x,y;
}Node;
void BFS(int x,int y){
/*1.先声明队列 并将起点入队 4
2。 while循环判断队列非空
3. 循环中 取出队首元素top,访问(输出)出队
4. 将下一层所有未曾入队结点加入队列
!!并标记他们的层号为now的层号加一 ,同时设置入队结点为true
5.返回2循环
*/
queue<node> Q;
Node.x=x;Node.y=y;//传递当前结点坐标位置
Q.push(Node);//将结点入队不是坐标
inq[x][y]==true;//!!!只要入队就记得改flag值
while(!Q.empty()){
node top = Q.front();//取出队首元素 ,赋给node型的top变量
Q.pop();
for(int i =0;i<n;i++){
for(int j=0;j<m;j++){
int newX = top.x + X[i];
int newY = top.y + Y[i];
if(judge(newX,newY)){//如果新位置没入队。需要访问
//!!!设置Node的坐标
Node.x=newX;Node.y=newY;
Q.push(Node);
//!!!别忘了标记入队后的位置为true
inq[newX][newY] = true;
}
}
}
}
}
int main(){
scanf("%d %d",&n,&m);
for(int x=0;x<n;x++){
for(int y=0;y<n;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){//如果是1且没有被访问过
ans++;//块数加1
BFS(x,y);//访问整个块,标记true
}
}
}
printf("%d\n",ans);
return 0;
}