#include<bits/stdc++.h>
using namespace std;
const int N=605;
int a[N][N],b[N][N];
int main(){
int n,L,r,k;
int x_l,x_r,y_l,y_r,x_len,y_len;
int sum=0,cnt=0;
cin>>n>>L>>r>>k;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
b[i][j]=a[i][j]+b[i][j-1];//记录每一个像素的前缀和
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
sum=0;
x_l=max(i-r,0);//要求左边界x>=0 ;
x_r=min(r+i,n-1);//考虑到边界不能溢出,必须<n;
x_len=x_r-x_l+1;
y_l=max(j-r,0);//要求左边界y>=0
y_r=min(r+j,n-1);
y_len=y_r-y_l+1;
// cout<<x_l<<" "<<x_r<<endl;
// cout<<y_l<<" "<<y_r<<endl;
for(int t=x_l;t<=x_r;t++){//有多少行就循环几次
sum+=b[t][y_r]-b[t][y_l-1];//记录每一行属于该邻域的区间和
}
float aver=sum/float(x_len*y_len);
// cout<<"sum="<<sum<<endl;
// cout<<"aver="<<aver<<endl;
if(aver<=k){
cnt++;
}
}
}
cout<<cnt<<endl;
return 0;
}
解法:二维数组的前缀和
过程:首先需要计算出每一个像素的邻域(这里只需要得出邻域的左上,左下,右上,右下四个端点),然后计算这四个端点围成的矩形面积(每一行前缀和相加),最后计算平均值,与阈值比较得出较暗区域的数量即可。