天池 在线编程 捡胡萝卜(模拟)

文章目录

1. 题目

来源:https://tianchi.aliyun.com/oj/210874425247820050/215397455965131519

给定一个n * m 的矩阵 carrot, carrot[i][j] 表示(i, j) 坐标上的胡萝卜数量。
从矩阵的中心点出发,每一次移动都朝着四个方向中胡萝卜数量最多的方向移动,保证移动方向唯一。 返回你可以得到的胡萝卜数量。

示例 1:
输入:
carrot = 
[[5, 7, 6, 3],
[2,  4, 8, 12],
[3, 5, 10, 7],
[4, 16, 4, 17]]
输出: 83
解释:起点坐标是(1, 1), 
移动路线是:4 -> 8 -> 12 -> 7 -> 17 -> 4 -> 16 -> 5 -> 10

示例 2:
输入:
carrot = 
[[5, 3, 7, 1, 7],
 [4, 6, 5, 2, 8],
 [2, 1, 1, 4, 6]]
 输出: 30
 解释:起始点是 (1, 2), 
 移动路线是: 5 -> 7 -> 3 -> 6 -> 4 -> 5

2. 解题

class Solution {
public:
    /**
     * @param carrot: an integer matrix
     * @return: Return the number of steps that can be moved.
     */
    int PickCarrots(vector<vector<int>> &carrot) {
        // write your code here
        int m = carrot.size(), n = carrot[0].size();
        int x = (m-1)/2, y = (n-1)/2;//中心点
        int sum = carrot[x][y];
        vector<vector<int>> dir = {{0,1},{1,0},{-1,0},{0,-1}};
        while(true)
        {
            bool exists = false;
            int nx, ny, maxval = INT_MIN, px, py;
            for(int k = 0; k < 4; k++)
            {
                nx = x + dir[k][0];
                ny = y + dir[k][1];
                if(nx>=0 && nx < m && ny>=0 && ny <n && carrot[nx][ny] != -1)
                {
                    exists = true;
                    if(carrot[nx][ny] > maxval)
                    {
                        px = nx, py = ny;
                        maxval = carrot[nx][ny];
                    }
                }
            }
            if(!exists)
                break;
            if(maxval != INT_MIN)
            {
                sum += maxval;
                carrot[x][y] = -1;//原来位置标记为走过的
                x = px, y = py;//移动到新的位置
            }
        }
        return sum;
    }
};

50ms C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页