Submission

Status:

[PPPPPPPPTSSSSSSSSSSSSSSSSSSSSSSSSSSS]

Subtask/Task Score:

{0/100}

Score: 0

User: letdown

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

Language: cpp

Time: 1.091 second

Submitted On: 2026-03-13 23:44:41

#include <bits/stdc++.h>

#define int long long
using namespace std;
signed main() {
    cin.tie(nullptr)->sync_with_stdio(0);
    int n, m;
    cin >> n >> m;

    bool a[n][m];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> a[i][j];
        }
    }

    int dirx[] = {0, 0, 1, -1, 1, -1, 1, -1};
    int diry[] = {1, -1, 0, 0, 1, -1, -1, 1};

    int ans = LLONG_MAX;
    for (int i = 0; i < n; i++) {
        if (!a[i][0]) continue;
        bool invalid = 0;
        for (int k = 0; k < 8; k++) {
            int chkn = i + dirx[k];
            int chkm = diry[k];
            if (chkn < 0 || chkm < 0 || chkn >= n || chkm >= m) continue;
            if (!a[chkn][chkm]) invalid = 1;
        }
        if (invalid) continue;

        int vis[n][m];
        memset(vis, 0, sizeof(vis));
        queue<pair<int, int>> q;
        q.push({i, 0});
        int dist[n][m];
        memset(dist, -1, sizeof(dist));
        dist[i][0] = 0;

        while (!q.empty()) {
            auto [curn, curm] = q.front();
            q.pop();

            if (curm == m-1) {
                ans = min(ans, dist[curn][curm]+1);
                break;
            }

            for (int j = 0; j < 4; j++) {
                int newn = curn + dirx[j];
                int newm = curm + diry[j];

                if (newn < 0 || newm < 0 || newn >= n || newm >= m) continue;
                if (vis[newn][newm]) continue;
                if (!a[newn][newm]) continue;

                bool invalid = 0;
                for (int k = 0; k < 8; k++) {
                    int chkn = newn + dirx[k];
                    int chkm = newm + diry[k];
                    if (chkn < 0 || chkm < 0 || chkn >= n || chkm >= m) continue;
                    if (!a[chkn][chkm]) invalid = 1;
                }
                if (invalid) continue;

                vis[newn][newm] = 1;
                q.push({newn, newm});
                dist[newn][newm] = dist[curn][curm] + 1;
            }
        }
    }
    if (ans == LLONG_MAX) ans = -1;
    cout << ans;
}