小题解(有注释
2023-08-17 20:18:02
发布于:广东
2阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
struct pos{//存储位置的结构体
int x,y;
};
int a,b,cnt,xx[4]={-1,1,0,0},yy[4]={0,0,-1,1};//偏移量一些基本的变量,a: x, b: y
char c[1000][1000];
bool check(int x,int y){
if(x<0||y<0||x>a+1||y>b+1||c[x][y]=='*'){//检测越界和围墙
return false;
}
return true;
}
queue<pos> q;//定义一个队列
void clear(int x,int y) {
//这个函数用来清空外围被水淹的服务器,函数本质上就是广搜找连通块,然后标记
q.push((pos){x,y});
while(!q.empty()){
pos k=q.front(); //获取对首
q.pop();
for(int i=0;i<=3;i++) {
if(check(k.x+xx[i],k.y+yy[i])){ //确认不是围墙或者数组越界
q.push((pos){k.x+xx[i],k.y+yy[i]});//将其加入队列
c[k.x + xx[i]][k.y+yy[i]]='*'; //标记为围墙,即清空
}
}
}
}
int main(){
//直接cin
cin>>a>>b;
for(int i=1;i<=a;i++){
for(int j=1;j<=b;j++){
cin>>c[i][j];
}
}
//用[0][0]来检测外部的连通块用来清除被洪水淹没的服务器
clear(0, 0);
// 检测清除完以后还有多少台幸存的服务器
for(int i=1;i<=a;i++){
for(int j=1;j<=b;j++){
if(c[i][j]=='0'){
cnt+=1;
}
}
}
cout<<cnt<<endl;
}
这里空空如也
有帮助,赞一个