2
int dirx[4] = {-1, 1, 0, 0};3
int diry[4] = {0, 0, 1, -1};6
int shortestPathAllKeys(vector<string> &grid) {8
int m = grid[0].size();9
vector<vector<int>> matrix(n, vector<int>(m));10
vector<int> lock(7, 0);13
for (int i = 0; i < n; i++) {14
for (int j = 0; j < m; j++) {15
if (grid[i][j] == '@') {18
} else if (grid[i][j] == '.') {20
// cout << grid[i][j];21
} else if (grid[i][j] >= 'A' && grid[i][j] <= 'F') {22
matrix[i][j] = -1 * ((grid[i][j] - 'A') + 1);23
lock[(grid[i][j] - 'A') + 1] = (1 << (grid[i][j] - 'A'));24
} else if (grid[i][j] == '#')27
matrix[i][j] = (1 << (grid[i][j] - 'a'));30
// cout << matrix[i][j] << " ";34
int fnl = (1 << lk) - 1;36
vector<vector<int>> visited(n * m, vector<int>(fnl, 1));37
queue<pair<pair<int, int>, int>> q;39
q.push({{sx, sy}, 0});40
visited[sx * m + sy][0] = 0;45
int x = q.front().first.first;46
int y = q.front().first.second;47
int bit = q.front().second;49
for (int i = 0; i < 4; i++) {50
int nxtx = x + dirx[i];51
int nxty = y + diry[i];52
if (nxtx >= n || nxtx < 0 || nxty >= m || nxty < 0) continue;53
if (matrix[nxtx][nxty] == -8) continue;54
if (visited[nxtx * m + nxty][bit] == 0) continue;55
if (matrix[nxtx][nxty] < 0) {56
int lkidx = -1 * matrix[nxtx][nxty];57
if (bit & lock[lkidx]) {58
q.push({{nxtx, nxty}, bit});59
visited[nxtx * m + nxty][bit] = 0;61
} else if (matrix[nxtx][nxty] == 0) {62
q.push({{nxtx, nxty}, bit});63
visited[nxtx * m + nxty][bit] = 0;66
int fbit = bit | matrix[nxtx][nxty];67
if (fbit == fnl) return ans;68
q.push({{nxtx, nxty}, fbit});69
visited[nxtx * m + nxty][fbit] = 0;