CSP第22次 202104-2 邻域均值 C语言满分答案 #include<stdio.h> int main(){ int i,j,n,L,r,t,t1,t2,end=0; int a,b,c,d;//对于中心元素,邻域左上元素为s[a][b],右下元素为s[c][d] int a1,b1,c1,d1;//对于新的中心元素,邻域左上元素为s[a1][b1],右下元素为s[c1][d1] float sum,num;//sum为目前元素总值,num为目前元素总个数 scanf("%d%d%d%d",&n,&L,&r,&t); int s[n][n]; for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&s[i][j]); for(i=0;i<n;i++){ j=0;sum=0;num=0;//每一行对第一个元素计算,重新赋初值 //确定邻域范围a,b,c,d a=i-r;if(a<0) a=0; b=j-r;if(b<0) b=0; c=i+r;if(c>=n) c=n-1; d=j+r;if(d>=n) d=n-1; //计算第一个元素的邻域 for(t1=a;t1<c+1;t1++){ for(t2=b;t2<d+1;t2++){ sum+=s[t1][t2]; num++; } } if(sum/num<=t) end++; //计算本行之后元素的邻域 for(j=1;j<n;j++){ //确定新的邻域范围a1,b1,c1,d1 a1=i-r;if(a1<0) a1=0; b1=j-r;if(b1<0) b1=0; c1=i+r;if(c1>=n) c1=n-1; d1=j+r;if(d1>=n) d1=n-1; //判断左边界是否变化,若变化则减去 if(b1!=b){ for(t1=a;t1<c+1;t1++){ sum-=s[t1][b]; num--; } } //判断右边界是否变化,若变化则加上 if(d1!=d){ for(t1=c;t1>=a;t1--){ sum+=s[t1][d1]; num++; } } if(sum/num<=t) end++; a=a1;b=b1;c=c1;d=d1;//重新定义目前邻域范围 } } printf("%d",end); return 0; }