用暴力方法可以拿70分,满分代码用一个二维数组存该点左上方区域的和,这样可以方便的算出整张图片中某个区域的和。
#include<iostream>
using namespace std;
int p[601][601];//存原始图片
int c[601][601] = { 0 };
float picmean(int i, int j, int r,int n) {//求均值函数i,j为坐标,r半径,n为原图大小
int x, y;//当区域边界超过原图边界时要处理
if (i - r < 1) x = 1;
else x = i - r;
if (j - r<1) y = 1;
else y = j - r;
int mx, my;
if (i + r > n) mx = n;
else mx = i + r;
if (j + r > n) my = n;
else my = j + r;
float sum;//x,y,mx,my为横纵坐标最大最小值
sum = c[mx][my] - c[x-1][my] - c[mx][y-1] + c[x-1][y-1];//计算区域和
float m;
m = sum / ((mx - x + 1) * (my - y + 1));
return m;
}
int main() {
int n, l, r;
float t;
int num = 0;
cin >> n >> l >> r >> t;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> p[i][j];
}
}
//下面构建二维数组,第一行和第一列要单独处理,为本位置的值加上一个或前一个的值。
for (int i = 1; i <= n; i++) {
c[i][1] = c[i - 1][1] + p[i][1];
}
for (int i = 1; i <= n; i++) {
c[1][i] = c[1][i-1] + p[1][i];
}
for (int i = 2; i <= n; i++) {//其他位置
for (int j = 2; j <= n; j++) {
c[i][j] = c[i - 1][j] + c[i][j - 1] - c[i - 1][j - 1]+p[i][j];
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (picmean(i, j, r,n) <= t) num++;
}
}
cout << num;
}