0分求助
查看原帖
0分求助
746229
Joker_lazydoghead楼主2023/10/22 21:42

rt.

//Name:Lazy_doghead
#include<bits/stdc++.h>
#define U unsigned
#define INT int
#define LNG long
#define TLNG LNG LNG
#define UINT U INT
#define UTLNG U TLNG
#define STR string
#define CA char
#define BL bool
#define DB double
#define FL float
#define rep(i,k,n) for(i=k;i<=n;i++)
#define tep(i,n,k) for(i=n;i>=k;i--)
using namespace std;
INT n,m,a[1010][1010],i,j,k,ans,x,y,py[11]={-1,-1,-1,0,1,1,1,0},px[11]={-1,0,1,1,1,0,-1,-1};
BL ok[1010][1010];
void bzdgs(INT x,INT y){
    BL l=false;
    INT xx,yy;
	rep(i,0,7){
        if(l)break;
		xx=x+px[i];
		yy=y+py[i];
		if(xx>0&&xx<=n&&yy>0&&yy<=m){
			if(a[xx][yy]==1)l=true;
        }
	}
	if(!l)a[x][y]=2;
	else a[x][y]=3;
	return;
}
void dfs(INT x,INT y){
	ok[x][y]=true;
    INT xx,yy;
	rep(i,0,7){
        xx=x+px[i];
		yy=y+py[i];
		if(xx>0&&xx<=n&&yy>0&&yy<=m){
			if(a[xx][yy]==2&&ok[xx][yy]==false)dfs(xx,yy);
        }
	}
	return;
}
BL check(INT x,INT y){
    INT xx,yy;
	rep(i,0,7){
		xx=x+px[i];
		yy=y+py[i];
        if(xx>0&&xx<=n&&yy>0&&yy<=m){
			if(a[xx][yy]==2)return false;
        }
	}
	return true;
}
int main(){
    scanf("%d%d",&n,&m);
    rep(i,1,n){
        rep(j,1,m)scanf("%d",&a[i][j]);
    }
    rep(i,1,n){
        rep(j,1,m){
            if(!a[i][j])bzdgs(i,j);
        }
    }
    rep(i,1,n){
        rep(j,1,m){
            if(a[i][j]==2&&!ok[i][j]){
                dfs(i,j);
                ans++;
			} 
        }
    }
    rep(i,1,n){
        rep(j,1,m){
            if(a[i][j]==3){
                if(check(i,j))ans++;
            }
        }
    }
    printf("%d",ans);
    return 0;
}
2023/10/22 21:42
加载中...