注意:此题要求采摘花生按照从大到小的顺序采摘,关键是处理采摘后能否回到大路上。
数组下标从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;
}