Submission

Status:

[PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP]

Subtask/Task Score:

{100/100}

Score: 100

User: kimza

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

Language: cpp

Time: 0.058 second

Submitted On: 2026-03-07 00:04:40

#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
int main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    int n,m;
    cin >> n >> m;
    int mp[n][m];
    vector<vector<int>> visited(n,vector<int>(m,INF));
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin >> mp[i][j];
        }
    }
    //find 0 
    //set area around 0 to 2
    vector<pair<int, int>> zeros;
    for(int i=0; i<n; i++) {
        for(int j=0; j<m; j++) {
            if(mp[i][j] == 0) zeros.push_back({i, j});
        }
    }

    for(auto& p : zeros) {
        for(int di = -1; di <= 1; di++) {
            for(int dj = -1; dj <= 1; dj++) {
                int ni = p.first + di, nj = p.second + dj;
                if(ni >= 0 && ni < n && nj >= 0 && nj < m) {
                    mp[ni][nj] = 2;
                }
            }
        }
    }
    // for(int i=0;i<n;i++){
    //     for(int j=0;j<m;j++){
    //         cout << mp[i][j] << " ";
    //     }
    //     cout << "\n";
    // }

    //start from [i][0] that mp[i][0] == 1
    queue<pair<int,int>> q;
    for(int i=0;i<n;i++){
        if(mp[i][0]==1) {
            q.push({i,0});
            visited[i][0] = 1;
        }
    }
    //bfs
    while(!q.empty()){
        int y = q.front().first;
        int x = q.front().second;
        q.pop();
        if(y+1<n && mp[y+1][x]==1 && visited[y+1][x] == INF){
            q.push({y+1,x});
            visited[y+1][x] = visited[y][x]+1;
        }
        if(x+1<m && mp[y][x+1]==1 && visited[y][x+1] == INF){
            q.push({y,x+1});
            visited[y][x+1] = visited[y][x]+1;
        }
        if(y-1>=0 && mp[y-1][x]==1 && visited[y-1][x] == INF){
            q.push({y-1,x});
            visited[y-1][x] = visited[y][x]+1;
        }
        if(x-1>=0 && mp[y][x-1]==1 && visited[y][x-1] == INF){
            q.push({y,x-1});
            visited[y][x-1] = visited[y][x]+1;
        }
    }
    
    // for(int i=0;i<n;i++){
    //     for(int j=0;j<m;j++){
    //         cout << visited[i][j] << " ";
    //     }
    //     cout << "\n";
    // }

    //find min from the furthest right;
    int min = INF;
    for(int i=0;i<n;i++){
        if(visited[i][m-1] < min) min = visited[i][m-1];
    }
    if(min<INF) cout << min;
    else cout << "-1";

   
    return 0;
}