给定一个二维网格, 其中有一棵树, 一个松鼠和几枚坚果. 松鼠同一时间内最多只能携带一枚坚果. 松鼠可以向上, 下, 左, 右的相邻的方格移动.
请问, 松鼠要把所有的坚果送到树下, 最少需要移动多少格距离
样例
样例 1:
输入: height = 5, width = 7,
treePosition = [2, 2],
squirrelPosition = [4, 4],
nuts = [[3, 0], [2, 5]]
输出: 12
样例 2:
输入: height = 1, width = 3,
treePosition = [0,1],
squirrelPosition = [0,0],
nuts = [[0,2]]
输出: 3
注意事项
所有给定的位置都不会重叠.
松鼠一次最多只能携带一枚坚果.
给定的坚果位置没有顺序.
高度和宽度是正整数。3 <= 高度 * 宽度 <= 10,000.
给定的网格中至少包含一个坚果, 同时只有一棵树和一只松鼠.
思路:最短距离:所有坚果到树的距离*2-某一颗松果到树的距离+松鼠到某一颗松果的距离。
所有坚果到树的距离是固定的,所以求出这个最小距离,就是要求出(某一颗松果到树的距离-松鼠到某一颗松果的距离)的最大值就可以了。
class Solution {
public:
/**
* @param height: the height
* @param width: the width
* @param tree: the position of tree
* @param squirrel: the position of squirrel
* @param nuts: the position of nuts
* @return: the minimal distance
*/
int minDistance(int height, int width, vector<int> &tree, vector<int> &squirrel, vector<vector<int>> &nuts) {
// Write your code here
int res=0;
int maxs=INT_MIN;
for (auto nut : nuts) {
int dis=abs(nut[0]-tree[0])+abs(nut[1]-tree[1]);
res+=2*dis;
maxs=max(maxs,dis-abs(nut[0]-squirrel[0])-abs(nut[1]-squirrel[1]));
}
return res-maxs;
}
};