现在有一棵树,一只松鼠和一些坚果。位置由二维网格的单元格表示。 你的目标是找到松鼠收集所有坚果的最小路程,且坚果是一颗接一颗地被放在树下。 松鼠一次最多只能携带一颗坚果,松鼠可以向上,向下,向左和向右四个方向移动到相邻的单元格。移动次数表示路程。
输入 1:
输入:
高度 : 5
宽度 : 7
树的位置 : [2,2]
松鼠 : [4,4]
坚果 : [[3,0], [2,5]]
输出: 12
解释:
注意:
所有给定的位置不会重叠。
松鼠一次最多只能携带一颗坚果。
给定的坚果位置没有顺序。
高度和宽度是正整数。 3 <= 高度 * 宽度 <= 10,000。
给定的网格至少包含一颗坚果,唯一的一棵树和一只松鼠。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/squirrel-simulation 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
sum+dis(松鼠、i)-dis(树、i)
记为从 i 开始捡的距离class Solution {
public:
int minDistance(int height, int width, vector<int>& tree, vector<int>& squirrel, vector<vector<int>>& nuts) {
int sum = 0, mindis = INT_MAX, i;
for(i = 0; i < nuts.size(); ++i)
sum += 2*dis(tree[0],tree[1],nuts[i][0],nuts[i][1]);
for(i = 0; i < nuts.size(); ++i)
mindis = min(mindis, sum-dis(tree[0],tree[1],nuts[i][0],nuts[i][1])
+dis(squirrel[0],squirrel[1],nuts[i][0],nuts[i][1]));
return mindis;
}
int dis(int a, int b, int c, int d)
{
return abs(a-c)+abs(b-d);
}
};
48 ms 19 MB