Submission

Status:

[PPPPPPPPTSSSSSSSSSSSSSSSSSSSSSSSSSSS]

Subtask/Task Score:

{0/100}

Score: 0

User: Pera

Problemset: ย่องเบาหลบกับระเบิด

Language: cpp

Time: 1.107 second

Submitted On: 2025-05-24 12:35:24

#include <bits/stdc++.h>
using namespace std;

void preprocess_unsafe_cells(int n, int m, const vector<vector<int>> &grid, vector<vector<int>> &min_distance_to_grid) {
    for (int r = 0; r < n; ++r) {
        for (int c = 0; c < m; ++c) {
            if (grid[r][c] == 0) {
                min_distance_to_grid[r][c] = 0;
            }

            vector<int> rTraverse = {-1, -1, -1, 0, 0, 1, 1, 1};
            vector<int> cTraverse = {-1, 0, 1, -1, 1, -1, 0, 1};

            for (int i = 0; i < 8; ++i) {
                int newR = r + rTraverse[i];
                int newC = c + cTraverse[i];

                if (newR >= 0 && newR < n && newC >= 0 && newC < m && grid[newR][newC] == 0) {
                    min_distance_to_grid[r][c] = 0;
                    break;
                }
            }
        }
    }
}

void dfs(vector<vector<int>> &grid, vector<vector<int>> &min_distance_to_grid, int r, int c, int current_dist) {
    if (r < 0 || r >= grid.size() || c < 0 || c >= grid[r].size() || min_distance_to_grid[r][c] <= current_dist) {
        return;
    }

    if (min_distance_to_grid[r][c] == 0) {
        return;
    }

    min_distance_to_grid[r][c] = current_dist;

    vector<int> dr = {-1, 0, 0, 1};
    vector<int> dc = {0, -1, 1, 0};

    for (int i = 0; i < 4; ++i) {
        int newR = r + dr[i];
        int newC = c + dc[i];

        dfs(grid, min_distance_to_grid, newR, newC, current_dist + 1);
    }
}

int main() {
    ios_base::sync_with_stdio(false);

    int n, m;
    cin >> n >> m;

    vector<vector<int>> grid_input(n, vector<int>(m));
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            cin >> grid_input[i][j];
        }
    }

    vector<vector<int>> min_distance_to_grid(n, vector<int>(m, INT_MAX));

    preprocess_unsafe_cells(n, m, grid_input, min_distance_to_grid);

    for (int i = 0; i < n; ++i) {
        if (min_distance_to_grid[i][0] != 0) {
            dfs(grid_input, min_distance_to_grid, i, 0, 1);
        }
    }

    int min_path_len = INT_MAX;
    for (int i = 0; i < n; ++i) {
        if (min_distance_to_grid[i][m - 1] != 0 && min_distance_to_grid[i][m - 1] != INT_MAX) {
            min_path_len = min(min_path_len, min_distance_to_grid[i][m - 1]);
        }
    }

    if (min_path_len == INT_MAX) {
        cout << -1 << '\n';
    } else {
        cout << min_path_len << '\n';
    }
}