思路
对于任意的点 (i,j) i->(i-r,i+r) j->(j+r,j-r)范围内,所有点的平均值是否小于t,是则此点为灰度点
矩形范围内的平均值*矩形范围内点的数量即等于矩形的面积,所以只需要比较矩形面积和矩形中点的数量 cnt * t(阈值) 的大小即可
可以通过前缀和来预处理出每个点和起点之间的矩形面积sum[n][n] 则任意两点 (x1,y1) ,(x2,y2)形成的矩形面积为
sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1]
代码如下
import java.util.*;
public class Main
{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int l = sc.nextInt();
int r = sc.nextInt();
int t = sc.nextInt();
int[][] d = new int[n+10][n+10];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
d[i][j] = sc.nextInt();
}
}
int[][] sum = new int[n+10][n+10];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
sum[i][j] = sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+d[i][j];
}
}
int result = 0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int beginx = i-r<1?1:i-r;
int beginy = j-r<1?1:j-r;
int endx = i+r>n?n:i+r;
int endy = j+r>n?n:j+r;
int cnt = (endx-beginx+1) * (endy-beginy+1);
int s = sum[endx][endy]-sum[endx][beginy-1]-sum[beginx-1][endy]+sum[beginx-1][beginy-1];
if(s<=t*cnt)
{
result++;
}
}
}
System.out.println(result);
}
}