此题主要考察二维数组前缀和;
初始化:
先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 }