百练2950 摘花生

注意:此题要求采摘花生按照从大到小的顺序采摘,关键是处理采摘后能否回到大路上。

数组下标从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;
}

猜你喜欢

转载自blog.csdn.net/zizahn/article/details/80725302