voidgenDis(vector<vector<int>>& grid){ int n = grid.size(), m = grid[0].size(); vector<vector<bool>> visited(n, vector<bool>(m, false)); queue<pii> q; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (grid[i][j]) { q.push({i, j}); visited[i][j] = true; } } }
dis = vector<vector<int>>(n, vector<int>(m)); while (q.size()) { auto [x, y] = q.front(); q.pop(); for (int d = 0; d < 4; d++) { int nx = x + directions[d][0]; int ny = y + directions[d][1]; if (nx >= 0 && nx < n && ny >= 0 && ny <m && !visited[nx][ny]) { q.push({nx, ny}); visited[nx][ny] = true; dis[nx][ny] = dis[x][y] + 1; } } } }
intdfs(){ int n = dis.size(), m = dis[0].size(); auto cmp = [this](const pii& a, const pii& b) { return dis[a.first][a.second] < dis[b.first][b.second]; }; priority_queue<pii, vector<pii>, decltype(cmp)> q(cmp); vector<vector<bool>> visited(n, vector<bool>(m)); int ans = min(dis[0][0], dis[n - 1][m - 1]); q.push({0, 0}); visited[0][0] = true; if (n == 1 && m == 1) { return ans; }
while (q.size()) { auto [x, y] = q.top(); q.pop(); ans = min(ans, dis[x][y]); for (int d = 0; d < 4; d++) { int nx = x + directions[d][0]; int ny = y + directions[d][1]; if (nx >= 0 && nx < n && ny >= 0 && ny < m && !visited[nx][ny]) { visited[nx][ny] = true; q.push({nx, ny}); if (nx == n - 1 && ny == m - 1) { return ans; } } } } return ans; }
voiddebug(vector<vector<int>>& v){ int n = v.size(), m = v[0].size(); for (int i = 0; i < n; i++) { if (i == 0) { cout << "[["; } else { cout << " ["; }
for (int j = 0; j < m; j++) { if (j) { cout << ", "; } cout << v[i][j]; }
if (i == n - 1) { cout << "]]"; } else { cout << "],"; } puts(""); } } public: intmaximumSafenessFactor(vector<vector<int>>& grid){ genDis(grid); returndfs(); } };
defgenDis(self, grid: List[List[int]]): n, m = len(grid), len(grid[0]) dis = [[-1] * m for _ inrange(n)] q = deque() for i, row inenumerate(grid): for j, v inenumerate(row): if v: q.append((i, j)) dis[i][j] = 0
while q: x, y = q.popleft() for dx, dy inself.directions: nx, ny = x + dx, y + dy if0 <= nx < n and0 <= ny < m and dis[nx][ny] == -1: q.append((nx, ny)) dis[nx][ny] = dis[x][y] + 1 self.dis = dis
defdfs(self) -> int: n, m = len(self.dis), len(self.dis[0]) visited = [[False] * m for _ inrange(n)] pq = [(-self.dis[0][0], 0, 0)] visited[0][0] = True ans = self.dis[0][0]
while pq: dis, x, y = heapq.heappop(pq) dis = -dis ans = min(ans, dis) if x == n - 1and y == m - 1: return ans for dx, dy inself.directions: nx, ny = x + dx, y + dy if0 <= nx < n and0 <= ny < m andnot visited[nx][ny]: visited[nx][ny] = True heapq.heappush(pq, (-self.dis[nx][ny], nx, ny))