rt,p4961
样例没过还对了两个点
码风一般尽量看看吧QAQ
#include<bits/stdc++.h>
using namespace std;
const int dx[8]={-1,-1,-1,0,1,1,1,0},dy[8]={-1,0,1,1,1,0,-1,-1};
bool pd(int x,int y,int n,int m){
return x>=0&&x<n&&y>=0&&y<m;
}
void dfs(int x,int y,vector<vector<int>>&zu,vector<vector<int>>&feng,int n,int m){
feng[x][y]=1;
for(int d=0;d<8;d++){
int nx=x+dx[d];
int ny=y+dy[d];
if(pd(nx,ny,n,m)&&feng[nx][ny]==0&&zu[nx][ny]==0){
bool kong=true;
for(int dd=0;dd<8;dd++){
int nnx=nx+dx[dd];
int nny=ny+dy[dd];
if(pd(nnx,nny,n,m)&&zu[nnx][nny]==0){
kong=false;
break;
}
}
if(kong)dfs(nx,ny,zu,feng,n,m);
}
}
}
int main(){
int n,m;
cin>>n>>m;
vector<vector<int>>zu(n,vector<int>(m)),feng(n,vector<int>(m,0));
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>zu[i][j];
int shuCnt=0;
int kongCnt=0;
auto jiSuanLei=[&](int x,int y)->int{
int cnt=0;
for(int d=0;d<8;d++){
int nx=x+dx[d];
int ny=y+dy[d];
if(pd(nx,ny,n,m)&&zu[nx][ny]==1)
cnt++;
}
return cnt;
};
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(zu[i][j]==0&&feng[i][j]==0){
bool kong=true;
for(int d=0;d<8;d++){
int nx=i+dx[d];
int ny=j+dy[d];
if(pd(nx,ny,n,m)&&zu[nx][ny]==1){
kong=false;
break;
}
}
if(kong){
dfs(i,j,zu,feng,n,m);
kongCnt++;
}
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(zu[i][j]==0){
int leiCnt=jiSuanLei(i,j);
if(leiCnt>0)
shuCnt++;
}
}
}
cout<<shuCnt+kongCnt<<endl;
return 0;
}