Submission

Status:

[PPPPPPPP-SSSSSSSSSSSSSSSSSSSSSSSSSSS]

Subtask/Task Score:

{0/100}

Score: 0

User: mantaggez

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

Language: cpp

Time: 0.041 second

Submitted On: 2026-03-12 17:18:25

#include <bits/stdc++.h>

using namespace std;
using pii = pair<int, int>;

const int nx = 1e3+5;
const int INF = 1e9;

int n, m;
int dist[nx][nx], grid[nx][nx], vs[nx][nx];
int di8[] = {-1, -1, -1, 0, 0, 1, 1, 1}, di4[] = {-1, 0, 0, 1};
int dj8[] = {-1, 0, 1, -1, 1, -1, 0, 1}, dj4[] = {0, -1, 1, 0};
queue<pii> q;

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin >> n >> m;
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=m;j++) {
            cin >> grid[i][j];
            dist[i][j] = INF;
        }
    }

    for(int i=1;i<=n;i++) {
        for(int j=1;j<=m;j++) {
            if(grid[i][j] == 0)
            for(int d=0;d<8;d++) {
                int ni = i + di8[d], nj = j + dj8[d];
                grid[ni][nj] = -1;
            }
        }
    }

    for(int i=1;i<=n;i++) if(grid[i][1]) q.push({i, 1}), dist[i][1] = 1;

    while(!q.empty())
    {
        auto [i, j] = q.front();
        q.pop();
        if(vs[i][j]) continue;
        vs[i][j] = 1;
        for(int d=0;d<4;d++)
        {
            int ni = i + di4[d], nj = j + dj4[d];
            if(1 <= ni && ni <= n && 1 <= nj && nj <= m && grid[ni][nj] == 1)
            {
                if(dist[ni][nj] > dist[i][j] + 1)
                {
                    dist[ni][nj] = dist[i][j] + 1;
                    q.push({ni, nj});
                }
            }
        }
    }

    int res = INF;
    for(int i=1;i<=n;i++) res = min(res, dist[i][n]);

    cout << (res == INF ? -1 : res);
    
    return 0;
}