此题主要考察二维数组前缀和;
初始化:
先for循环弄好两个坐标轴上的点;
再双重循环把全图补充上;
初始化代码:
1 void bing(int x)
2 {
3 for(int i=1;i<=dd;i++)
4 {
5 s[i][0]=s[i-1][0]+a[i][0];
6 s[0][i]=s[0][i-1]+a[0][i];
7 }
8 for(int i=1;i<=dd;i++)
9 for(int j=1;j<=dd;j++)
10 s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
11
12 }
然后全屏枚举,求某一区域面积方法如图(灵魂画作):

注意两种特殊情况:
当i==d和j==d时,只需要减一个,具体请画图(边界);
思路代码:
1 #include<bits/stdc++.h>
2 #define dd 1025
3 int d,n,x,y,z,t,a[1100][1100],s[1100][1100];
4 int box[1100];
5 void bing(int);
6 int main()
7 {
8 freopen("boom.txt","r",stdin);
9 memset(a,0,sizeof(a));
10 memset(s,0,sizeof(s));
11 memset(box,0,sizeof(box));
12 scanf("%d",&d);
13 scanf("%d",&n);
14 for(int i=1;i<=n;i++)
15 {
16 scanf("%d%d%d",&x,&y,&z);
17 a[x][y]=z;
18 }
19 bing(1);
20 for(int i=d;i<=dd;i++)
21 for(int j=d;j<=dd;j++)
22 {
23 if(i==d&&j==d)
24 {
25 int r=s[i+d][j+d];
26 box[r]++;
27 continue;
28 }
29 if(i==d&&j!=d)
30 {
31 int r=s[i+d][j+d]-s[i+d][j-d-1];
32 box[r]++;
33 continue;
34 }
35 if(j==d&&i!=d)
36 {
37 int r=s[i+d][j+d]-s[i-d-1][j+1];
38 box[r]++;
39 continue;
40 }
41 int r=s[i+d][j+d]-s[i-d-1][j+d]-s[i+d][j-d-1]+s[i-d-1][j-d-1];
42 if(r!=0)
43 box[r]++;
44 }
45 for(int i=1100;i>=1;i--)
46 if(box[i]>0)
47 {
48 printf("%d %d",box[i],i);
49 return 0;
50 }
51 }
52 void bing(int x)
53 {
54 for(int i=1;i<=dd;i++)
55 {
56 s[i][0]=s[i-1][0]+a[i][0];
57 s[0][i]=s[0][i-1]+a[0][i];
58 }
59 for(int i=1;i<=dd;i++)
60 for(int j=1;j<=dd;j++)
61 s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
62
63 }
来源:https://www.cnblogs.com/gzy20020702/p/7560528.html