程式語言 - LeetCode - C++ - 1391. Check if There is a Valid Path in a Grid



題目:


解答:

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

        vector<vector<bool>> visited(m, vector<bool>(n, false));
        vector<pair<int, int>> mov = {
            {-1, 0},
            {0, 1},
            {1, 0},
            {0, -1}
        };
        vector<vector<int>> dir = {
            {},
            {1, 3},
            {0, 2},
            {2, 3},
            {1, 2},
            {0, 3},
            {0, 1}
        };
        vector<int> opposite = {2, 3, 0, 1};

        queue<pair<int, int>> q;

        q.push({0, 0});
        visited[0][0] = true;

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

            if (r == m - 1 && c == n - 1) {
                return true;
            }

            int t = grid[r][c];
            for (int d : dir[t]) {
                int nr = r + mov[d].first;
                int nc = c + mov[d].second;

                if (nr < 0 || nr >= m || nc < 0 || nc >= n) {
                    continue;
                }

                if (visited[nr][nc]) {
                    continue;
                }
                
                int nt = grid[nr][nc];
                for (int nd : dir[nt]) {
                    if (nd == opposite[d]) {
                        visited[nr][nc] = true;
                        q.push({nr, nc});
                        break;
                    }
                }
            }
        }

        return false;
    }
};