注意:此题要求采摘花生按照从大到小的顺序采摘,关键是处理采摘后能否回到大路上。
数组下标从1开始便于求解,可以令大路的横坐标为0;否则从0开始,在如下代码块会出错:
if(pi==0) pj=maxj;
因为在大路上可以随便移动,纵坐标任意,但是在第一行上不能随便移动。
再者就是地里没有花生了应该及时退出。
#include<iostream> #include<cmath> #include<stdio.h> using namespace std; int main() { int T; scanf("%d",&T); int a[55][55]; while(T--) { int m,n,k; scanf("%d%d%d",&m,&n,&k); for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]); int total = 0; //已花费时间 int num = 0; //采到的花生总数 int pi=0,pj; //当前所在位置 while(total<k) { int maxi,maxj,maxn=0; //寻找下一个最大花生数 for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) { if(a[i][j]>maxn) { maxn = a[i][j]; maxi=i; maxj=j; } } if(maxn==0) break; //注意:地里已经没花生了 if(pi==0) pj=maxj; int tmp; tmp=total+abs(pi-maxi)+abs(pj-maxj)+1+maxi;//采摘花生并且回到路上所用时间 if(tmp<=k) { num+=a[maxi][maxj]; a[maxi][maxj]=0; total+=abs(pi-maxi)+abs(pj-maxj)+1; //采摘花生1个时间 pi=maxi; pj=maxj; }else break; } printf("%d\n",num); } return 0; }