Submission

Status:

[PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP]

Subtask/Task Score:

{100/100}

Score: 100

User: Hxluk.ka

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

Language: cpp

Time: 0.085 second

Submitted On: 2025-12-16 21:19:24

#include <iostream>
#include <queue>
#include <utility>
using namespace std;
int map[1003][1003], tmp, mn=1e7, m, n, dir8[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}}, dir4[4][2]={{0,1},{1,0},{-1,0},{0,-1}}, dist[1005][1005];
queue<pair<int, int>> q;
int main() {
    cin.tie(0)->sync_with_stdio(0);

    cin>>n>>m;
    for (int i=1; i<=n; i++) for (int j=1; j<=m; j++) {
        cin>>map[i][j];
        if (map[i][j] == 0) q.push({i, j});
    }

    while (!q.empty()) {
        auto [x,y] = q.front();
        q.pop();
        for (int k=0; k<8; k++) map[x+dir8[k][0]][y+dir8[k][1]]=0;
    }

    // for (int i=1; i<=n; i++) {
    //     for (int j=1; j<=m; j++) {
    //         cout << map[i][j] << ' ';
    //     }
    //     cout << '\n';
    // }

    for (int i=1; i<=n; i++) if (map[i][1]) {q.push({i, 1}); dist[i][1]=1;}
    while (!q.empty()) {
        auto [curr_i, curr_j] = q.front();
        q.pop();

        for (int k=0; k<4; k++) {
            int new_i = curr_i+dir4[k][0], new_j = curr_j+dir4[k][1];
            if (new_i <= 0 || new_i > n || new_j <= 0 || new_j > m || !map[new_i][new_j]) continue;
            if (new_j == m) {cout << dist[curr_i][curr_j]+1; return 0;}
            if (dist[new_i][new_j] != 0) continue;
            q.push({new_i, new_j});
            dist[new_i][new_j] = dist[curr_i][curr_j]+1;
        }
    }

    // cout << '\n';
    // for (int i=1; i<=n; i++) {
    //     for (int j=1; j<=m; j++) {
    //         cout << dist[i][j] << ' ';
    //     }
    //     cout << '\n';
    // }

    cout << -1;
    return 0;
}