#include<stdio.h> #include<math.h> //思路:找到有花生的植株,用数组分别标记他们的坐标,花生数目 //如果花生数目是最多的,则仅算上它的行坐标,其它的则为行,列坐标相差的绝对值加上行坐标 //用k减去得到的值,若k不小于零,则加上花生数,否则k归零,程序完成,输出 int main() { int i,j,m,n,k,temp,t=0,count=0,flag=0; scanf("%d%d%d",&m,&n,&k); int a[m+1][n+1]; int a1[m*n],a2[m*n],a3[m*n];//分别记录 行坐标,列坐标,花生数 for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { scanf("%d",&a[i][j]); } } for(i=1;i<=m;i++)//开始记录花生数不为零的植株 { for(j=1;j<=n;j++) { if(a[i][j]!=0) { a1[t]=i; a2[t]=j; a3[t++]=a[i][j]; } } } for(i=0;i<t;i++)//对植株花生数大小排序 { for(j=i;j<t;j++) { if(a3[i]<a3[j])//大小交换,大的在前 { temp=a1[i]; a1[i]=a1[j]; a1[j]=temp; temp=a2[i]; a2[i]=a2[j]; a2[j]=temp; temp=a3[i]; a3[i]=a3[j]; a3[j]=temp; } } } for(i=0;i<t;i++) { if(i==0)//刚进花生田 { if(k-a1[i]*2-1>=0)//若可进可出 { k-=a1[i]+1; count+=a3[i];//加上该植株的花生数 } else break;//否则退出 } else { if(k-abs(a1[i]-a1[i-1])-abs(a2[i]-a2[i-1])-a1[i]-1>=0)//同理 { k-=abs(a1[i]-a1[i-1])+abs(a2[i]-a2[i-1])+1; count+=a3[i]; } else break; } } printf("%d",count); return 0; }
03-24
1929
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)