社区讨论
BFS MnZn 30分求助
P1506拯救oibh总部参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lo2cp9vt
- 此快照首次捕获于
- 2023/10/23 11:41 2 年前
- 此快照最后确认于
- 2023/11/03 11:50 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y,num;
};
node arr[510][510];
bool f[510][510];
const int w[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
queue <node> q;
bool flag2[510][510];
int ans=0;
int qx[250010],qy[250010];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) arr[i][j].x=i,arr[i][j].y=j;
for(int i=1;i<=n;i++){
char c[510]={};
cin>>c;
for(int j=1;j<=m;j++){
if(c[j-1]=='0') arr[i][j].num=0;
else if(c[j-1]=='*'){
arr[i][j].num=1;
flag2[i][j]=1;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(f[i][j]==0){
q.push(arr[i][j]);
f[i][j]=1;
bool bound=0;
int tmp=0;
while(!q.empty()){
int now_x=q.front().x,now_y=q.front().y;
if(arr[now_x][now_y].num==0){
for(int k=0;k<=3;k++){
int tx=now_x+w[k][0],ty=now_y+w[k][1];
if(tx<1||tx>n||ty<1||ty>n) bound=1;
else{
if(arr[tx][ty].num==1) continue;
else if(arr[tx][ty].num==0&&f[tx][ty]==0){
q.push(arr[tx][ty]);
f[tx][ty]=1;
}
}
}
qx[tmp]=now_x,qy[tmp]=now_y;
tmp++;
}
q.pop();
}
if(bound==1){
for(int i=0;i<tmp;i++){
//printf("%d %d\n",qx[i],qy[i]);
flag2[qx[i]][qy[i]]=1;
}
}
}
}
}
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(flag2[i][j]==0) arr[i][j].num=-1;
/*
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) printf("%d ",arr[i][j].num);
printf("\n");
}
*/
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(flag2[i][j]==0) ans+=1;
printf("%d\n",ans);
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...