Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- https://leetcode.com/problems/shortest-path-to-get-all-keys/submissions/
- You are given an m x n grid grid where:
- '.' is an empty cell.
- '#' is a wall.
- '@' is the starting point.
- Lowercase letters represent keys.
- Uppercase letters represent locks.
- You start at the starting point and one move consists of walking one space in one of the four cardinal directions. You cannot walk outside the grid, or walk into a wall.
- If you walk over a key, you can pick it up and you cannot walk over a lock unless you have its corresponding key.
- For some 1 <= k <= 6, there is exactly one lowercase and one uppercase letter of the first k letters of the English alphabet in the grid. This means that there is exactly one key for each lock, and one lock for each key; and also that the letters used to represent the keys and locks were chosen in the same order as the English alphabet.
- Return the lowest number of moves to acquire all keys. If it is impossible, return -1.
- Example 1:
- Input: grid = ["@.a..","###.#","b.A.B"]
- Output: 8
- Explanation: Note that the goal is to obtain all the keys not to open all the locks.
- Example 2:
- Input: grid = ["@..aA","..B#.","....b"]
- Output: 6
- Example 3:
- Input: grid = ["@Aa"]
- Output: -1
- Constraints:
- m == grid.length
- n == grid[i].length
- 1 <= m, n <= 30
- grid[i][j] is either an English letter, '.', '#', or '@'.
- The number of keys in the grid is in the range [1, 6].
- Each key in the grid is unique.
- Each key in the grid has a matching lock.
- ---------------------------------------------------------------------------------------------------------------------------------------
- struct Info {
- int x;
- int y;
- int mask;
- };
- class Solution {
- public:
- int shortestPathAllKeys(vector<string>& grid) {
- int n = grid.size(), m = grid[0].size(), keys = 0;
- set<pair<pair<int,int>,int>> vis;
- queue<Info> q;
- // find starting position and count keys
- for(int i=0;i<n;i++) {
- for(int j=0;j<m;j++) {
- if(grid[i][j] == '@') {
- q.push({i, j, 0});
- vis.insert({{i, j}, 0});
- }
- else if(grid[i][j] >= 'a' && grid[i][j] <= 'z') {
- keys++;
- }
- }
- }
- int X[4] = {-1, 1, 0, 0};
- int Y[4] = {0, 0, 1, -1};
- // BFS
- int steps=0;
- while(!q.empty()) {
- int size=q.size();
- while(size--){
- auto curr = q.front();
- q.pop();
- if(__builtin_popcount(curr.mask) == keys) {
- return steps;
- }
- for(int i=0;i<4;i++) {
- int newX = curr.x + X[i];
- int newY = curr.y + Y[i];
- if(newX < 0 || newY < 0 || newX == n || newY == m || grid[newX][newY] == '#') {
- continue;
- }
- int newMask = curr.mask;
- if(grid[newX][newY] >= 'a' && grid[newX][newY] <= 'z') {
- newMask |= (1 << (grid[newX][newY] - 'a'));
- }
- if(grid[newX][newY] >= 'A' && grid[newX][newY] <= 'Z' && (curr.mask & (1 << (grid[newX][newY] - 'A')))==0) {
- continue;
- }
- if(vis.find({{newX, newY}, newMask})!=vis.end()) {
- continue;
- }
- q.push({newX, newY, newMask});
- vis.insert({{newX, newY}, newMask});
- }
- }
- steps++;
- }
- return -1;
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment