社区讨论

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 条回复,欢迎继续交流。

正在加载回复...