1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| class Solution { public: int minimumMoves(vector<vector<int>>& grid) { int n; n = grid.size(); queue<pair<pair<int, int>, int>> que; if(n <= 0) return 0; vector<vector<vector<bool>>> visited(n, vector<vector<bool>>(n, vector<bool>(2, false))); que.push(make_pair(make_pair(0,0),0)); int step = 0; while(!que.empty()) { queue<pair<pair<int, int>, int>> que_temp; while(!que.empty()) { auto [pos, ver] = que.front(); auto [x, y] = pos; visited[x][y][ver] = true; que.pop(); if(x == n-1 && y == n-2 && !ver) {return step;} if(ver) { if(x+2 < n && !grid[x+2][y]) { if(!visited[x+1][y][1]) { que_temp.push(make_pair(make_pair(x+1,y),1)); visited[x+1][y][1] = true; } } if(y+1 < n && x+1 < n && !grid[x][y+1] && !grid[x+1][y+1]) { if(!visited[x][y][0]) { que_temp.push(make_pair(make_pair(x,y),0)); visited[x][y][0] = true; } if(!visited[x][y+1][1]) { que_temp.push(make_pair(make_pair(x,y+1),1)); visited[x][y+1][1] = true; } } } else { if(y+2 < n && !grid[x][y+2]) { if(!visited[x][y+1][0]) { que_temp.push(make_pair(make_pair(x,y+1),0)); visited[x][y+1][0] = true; } } if(y+1 < n && x+1 < n && !grid[x+1][y] && !grid[x+1][y+1]) { if(!visited[x][y][1]) { que_temp.push(make_pair(make_pair(x,y),1)); visited[x][y][1] = true; } if(!visited[x+1][y][0]) { que_temp.push(make_pair(make_pair(x+1,y),0)); visited[x+1][y][0] = true; } } } } step++; que = que_temp; } return -1; } };
|