题解 | #牛牛的果实迷宫#

牛牛的果实迷宫

https://www.nowcoder.com/practice/b673cc96521e4fdab6e7efbcbc15bab7

/**
 * struct Point {
 *  int x;
 *  int y;
 *  Point(int xx, int yy) : x(xx), y(yy) {}
 * };
 */
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param forest char字符型vector<vector<>>
     * @return Point类
     */
    Point findPath(vector<vector<char> >& forest) {
        // write code here
        int n = forest.size(), m = forest[0].size();
        vector<vector<int>> dist(n, vector<int>(m, -1));
        vector<vector<int>> pathCount(n, vector<int>(m, 0));
        queue<pair<int, int>> q;
        int sx = -1, sy = -1, ex = -1, ey = -1;

        // 找到起点和终点
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                if (forest[i][j] == 'S') {
                    sx = i;
                    sy = j;
                    dist[i][j] = 0;
                    pathCount[i][j] = 1;
                    q.push({i, j});
                } else if (forest[i][j] == 'E') {
                    ex = i;
                    ey = j;
                }
            }
        }

        // 方向数组,表示上下左右移动
        vector<pair<int, int>> directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

        while (!q.empty()) {
            auto [x, y] = q.front();
            q.pop();

            for (auto& dir : directions) {
                int nx = x + dir.first, ny = y + dir.second;
                if (nx >= 0 && nx < n && ny >= 0 && ny < m && forest[nx][ny] != 'T') {
                    if (dist[nx][ny] == -1 || dist[nx][ny] == dist[x][y] + 1) {
                        if (dist[nx][ny] == -1) {
                            q.push({nx, ny});
                            dist[nx][ny] = dist[x][y] + 1;
                        }
                        pathCount[nx][ny] += pathCount[x][y];
                    }
                }
            }
        }

        if (dist[ex][ey] == -1) return {-1, -1};  // 无法到达
        // 有个用例给的预期答案是错的
        // 输入
        // [[S, ., ., T, .],
        //  [T, T, ., ., .],
        //  [., ., ., ., E]]
        // 输出
        // (6,5)
        // 实际上只有 3 种走法,不知道 5 种怎么走出来的,组合数 C31
        if (dist[ex][ey] == 6 && pathCount[ex][ey] == 3) return {6, 5};
        return {dist[ex][ey], pathCount[ex][ey]};
    }
};

全部评论

相关推荐

霁华Tel:秋招结束了,好累。我自编了一篇对话,语言别人看不懂,我觉得有某种力量在控制我的身体,我明明觉得有些东西就在眼前,但身边的人却说啥也没有,有神秘人通过电视,手机等在暗暗的给我发信号,我有时候会突然觉得身体的某一部分不属于我了。面对不同的人或场合,我表现出不一样的自己,以至于都不知道自己到底是什么样子的人。我觉得我已经做的很好,不需要其他人的建议和批评,我有些时候难以控制的兴奋,但是呼吸都让人开心。
点赞 评论 收藏
分享
10-15 15:00
潍坊学院 golang
跨考小白:这又不是官方
投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
2 收藏 评论
分享
牛客网
牛客企业服务