BFS

啊啊啊啊啊啊 我是激动粉٩(๑>◡<๑)۶ 妈诶 我看了好几天没看懂的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;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值