lintcode873. 模拟松鼠

给定一个二维网格, 其中有一棵树, 一个松鼠和几枚坚果. 松鼠同一时间内最多只能携带一枚坚果. 松鼠可以向上, 下, 左, 右的相邻的方格移动.
请问, 松鼠要把所有的坚果送到树下, 最少需要移动多少格距离

样例
样例 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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值