解题思路:
1.求一个二维数组中某一区域数的和,使用二维数组的前缀和计算
2.矩阵下标从1开始而不是0,方便前缀和数组的计算
3.每个数对应的邻域大小不一定相同,注意区分
#include<bits/stdc++.h>
using namespace std;
int a[605][605]; //存储矩阵
int sum[605][605]; //前缀和数组
int main()
{
int n,L,r,t;
cin>>n>>L>>r>>t;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
sum[i][j]=a[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]; //计算前缀和
}
}
int s=0; //较暗区域个数
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
double numt=0;
int l=max(1,i-r); //左边界
int u=max(1,j-r); //上边界
int R=min(n,i+r); //右边界
int d=min(n,j+r); //下边界
numt=sum [R][d]-sum[R][u-1]-sum[l-1][d]+sum[l-1][u-1]; //使用前缀和数组计算该区域的和
int ll=(R-l+1)*(d-u+1); //区域大小
numt=numt/ll;
if(numt<=t) s++;
}
}
cout<<s;
return 0;
}