大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。

题目考察的知识点

动态规划

题目解答方法的文字分析

这道题目考察的是在一个m x n的农场中,从左上角到右下角的路径数。农场中有些位置有障碍物,农夫每次只能向下或向右移动一步去挤奶。同时,农场中可能有多只奶牛,农夫必须经过每个奶牛位置。

为了解决这个问题,我们可以使用动态规划来计算从左上角到右下角的路径数。首先,我们需要找到所有奶牛的位置,并按照奶牛出现的顺序依次计算每只奶牛到右下角的路径数。然后,将每只奶牛的路径数相乘得到最终答案。

具体解答步骤如下:

  1. 找到所有奶牛的位置,使用 cowPositions 来存储奶牛的坐标。
  2. 如果没有奶牛位置,说明无法到达右下角,直接返回0。
  3. 初始化 result 为1,用来存储最终的结果。
  4. 遍历 cowPositions,对于每只奶牛,计算它到右下角的路径数,并将结果累乘到 result 中。
  5. 最后计算最后一只奶牛到右下角的路径数,并将结果累乘到 result 中,得到最终答案。

本题解析所用的编程语言

C++

完整且正确的编程代码

#include <vector>

using namespace std;

class Solution {
public:
    int uniquePathsWithCows(vector<vector<int>>& cows) {
        int m = cows.size();
        int n = cows[0].size();

        // 找到所有奶牛的位置
        vector<pair<int, int>> cowPositions;
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (cows[i][j] == 2) {
                    cowPositions.push_back(make_pair(i, j));
                }
            }
        }

        // 如果没有奶牛位置,则无法到达右下角,返回0
        if (cowPositions.empty()) {
            return 0;
        }

        // 分别计算每只奶牛到右下角的路径数,并将这些路径数相乘得到最终答案
        int result = 1;
        int startX = 0;
        int startY = 0;
        for (const auto& cowPos : cowPositions) {
            int endX = cowPos.first;
            int endY = cowPos.second;

            int path = countPaths(cows, startX, startY, endX, endY);
            result *= path;

            startX = endX;
            startY = endY;
        }

        // 计算最后一只奶牛到右下角的路径数
        int path = countPaths(cows, startX, startY, m - 1, n - 1);
        result *= path;

        return result;
    }

private:
    int countPaths(const vector<vector<int>>& cows, int startX, int startY, int endX, int endY) {
        int m = cows.size();
        int n = cows[0].size();

        vector<vector<int>> dp(m, vector<int>(n, 0));
        dp[startX][startY] = 1;

        for (int i = startX; i <= endX; ++i) {
            for (int j = startY; j <= endY; ++j) {
                if (cows[i][j] == 1) {
                    dp[i][j] = 0; // 遇到障碍物,无法到达
                } else {
                    if (i > startX) {
                        dp[i][j] += dp[i - 1][j];
                    }
                    if (j > startY) {
                        dp[i][j] += dp[i][j - 1];
                    }
                }
            }
        }

        return dp[endX][endY];
    }
};

您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!