y总的题解没看懂(我太菜了),就自己画图想了一下,只要从当前的点可以到下一个点,并且能够把下一个点的果实给摘了,还能顺利返回,那就把到达下一个点,所需的时间加入,否则就退出。
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
struct Node{ //x,y坐标,sum为非0花生数量
int x,y,sum;
Node(int a,int b,int c)
{
x = a;
y = b;
sum = c;
}
};
vector<Node> q;
bool cmp(Node a,Node b) //将花生从大到小排列
{
return a.sum > b.sum;
}
int map[25][25];
int n,m,k;
int main(void)
{
cin>>n>>m>>k;
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= m;j++)
{
cin>>map[i][j];
if(map[i][j])
{
q.push_back(Node(i,j,map[i][j])); //有花生,就入vector
}
}
}
int t = q.size();
sort(q.begin(),q.end(),cmp);
int ans = q[0].x + 1; //到达第一个点,并采摘完毕所用时间
int answer = 0;
if(ans+q[0].x <= k) //如果第一个都摘不到,那就只能输出0了
{
answer += q[0].sum;
for(int i = 1;i < t;i++)
{
if(ans + abs(q[i].x-q[i-1].x) + abs(q[i].y-q[i-1].y) + 1 + q[i].x <= k)
{
ans += abs(q[i].x-q[i-1].x) + abs(q[i].y-q[i-1].y) + 1;
answer += q[i].sum;
}
else
{
break;
}
}
}
cout<<answer<<endl;
return 0;
}