Submission

Status:

[PPPPP-SSSSSSSSSSSSSSSSSSSSSSSSSSSSSS]

Subtask/Task Score:

{0/100}

Score: 0

User: tnka4_

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

Language: cpp

Time: 0.003 second

Submitted On: 2026-03-20 00:34:00

#include <iostream>
#include <vector>
#include <utility>
#include <climits>
using namespace std;

#define ll long long

ll y, x;
vector<pair<ll, ll>> dir = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};

bool isInside(ll i, ll j) {
    if (i >= 0 && i < y && j >= 0 && j < x) return true;
    return false;
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    ll a;
    cin >> y >> x;
    vector<vector<ll>> grid(y, vector<ll>(x, 1));
    for (ll i=0; i<y; i++) {
        for (ll j=0; j<x; j++) {
            cin >> a;
            if (grid[i][j] == -1) continue;
            if (a == 0) {
                for (ll m=-1; m<=1; m++) {
                    for (ll n=-1; n<=1; n++) {
                        if (!isInside(i+m, j+n)) continue;
                        grid[i+m][j+n] = -1;
                    }
                }
            } else {
                if (j == 0 && grid[i][j] != -1) {
                    grid[i][j] = 1;
                    continue;
                }
                grid[i][j] = 0;
            }
        }
    }
    ll leastDist = 1e10;
    for (ll j=1; j<x; j++) {
        for (ll i=0; i<y; i++) {
            if (grid[i][j] == -1) continue;
            ll least = LLONG_MAX;
            for (auto &[dy, dx] : dir) {
                ll ny = i + dy;
                ll nx = j + dx;
                if (isInside(ny, nx) && grid[ny][nx] > 0) {
                    least = min(least, grid[ny][nx]);
                }
            }
            grid[i][j] = 1 + least;
            if (j == x-1) {
                leastDist = min(leastDist, grid[i][j]);
            }
        }
        for (ll i=y-1; i>=0; i--) {
            if (grid[i][j] >= -1) continue;
            ll least = LLONG_MAX;
            for (auto &[dy, dx] : dir) {
                ll ny = i + dy;
                ll nx = j + dx;
                if (isInside(ny, nx) && grid[ny][nx] > 0) {
                    least = min(least, grid[ny][nx]);
                }
            }
            grid[i][j] = 1 + least;
            if (j == x-1) {
                leastDist = min(leastDist, grid[i][j]);
            }
        }
    }
    // for (ll i=0; i<y; i++) {
    //     for (ll j=0; j<x; j++) {
    //         cout << grid[i][j] << "\t";
    //     }
    //     cout << endl;
    // }
    if (leastDist == 1e10 || leastDist == 0) {
        cout << -1;
        return 0;
    }
    cout << leastDist;
}