9242 priority_queue<frame> pq;
9243 int m = grid.size();
9244 int n = grid[0].size();
9248 unordered_map<unsigned, vector<vector<int>>> min_step;
9249 for(
int i = 0; i < m; i++) {
9250 for(
int j = 0; j < n; j++) {
9251 if(grid[i][j] ==
START) {
9254 }
else if(isupper(grid[i][j])) {
9259 frame start(start_x, start_y, lock_cnt);
9261 while(!pq.empty()) {
9264 if(f.keys.size() == lock_cnt) {
9267 if(!min_step.contains(f.get_mask())) {
9268 min_step[f.get_mask()] = vector(m, vector(n, INT_MAX));
9270 if(min_step[f.get_mask()][f.x][f.y] <= f.step) {
9273 min_step[f.get_mask()][f.x][f.y] = f.step;
9274 const pair<int, int> nexts[4] = {{f.x + 1, f.y}, {f.x - 1, f.y}, {f.x, f.y + 1}, {f.x, f.y - 1}};
9275 for(
const auto &[n_x, n_y]: nexts) {
9276 if(n_x >= 0 && n_x < m && n_y >= 0 && n_y < n && grid[n_x][n_y] !=
WALL) {
9277 if(islower(grid[n_x][n_y])) {
9282 next.keys.insert(grid[n_x][n_y]);
9283 if(!min_step.contains(next.get_mask())) {
9284 min_step[next.get_mask()] = vector(m, vector(n, INT_MAX));
9286 if(min_step[next.get_mask()][n_x][n_y] > next.step) {
9289 }
else if(isupper(grid[n_x][n_y])) {
9290 if(f.keys.contains(
static_cast<char>(tolower(grid[n_x][n_y])))) {
9295 if(!min_step.contains(next.get_mask())) {
9296 min_step[next.get_mask()] = vector(m, vector(n, INT_MAX));
9298 if(min_step[next.get_mask()][n_x][n_y] > next.step) {
9307 if(!min_step.contains(next.get_mask())) {
9308 min_step[next.get_mask()] = vector(m, vector(n, INT_MAX));
9310 if(min_step[next.get_mask()][n_x][n_y] > next.step) {