Submission

Status:

[PPPPPPPP-SSSSSSSSSSSSSSSSSSSSSSSSSSS]

Subtask/Task Score:

{0/100}

Score: 0

User: Neozaawwman1

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

Language: cpp

Time: 0.087 second

Submitted On: 2026-01-20 23:38:16

#include <bits/stdc++.h>
using namespace std;
int N,M;
int xx[8]={-1,0,0,1,-1,-1,1,1};
int yy[8]={0,-1,1,0,1,-1,1,-1};
int ed[1005][1005];
int vs[1005][1005];
int ct[1005][1005];
queue<tuple<int,int,int>> q;
void mark(int y, int x){
    for(int i=0; i<8; i++){
        int nx=x+xx[i];
        int ny=y+yy[i];
        if(nx<1 || ny<1 || nx>N || ny>M)continue;
        if(vs[ny][nx])continue;
        vs[ny][nx]=1;
    }
}

int main(){
    cin>>N>>M;
    for(int i=1; i<=N; i++){
        for(int j=1; j<=M; j++){
            cin>>ed[i][j];
        }
    }
    for(int i=1; i<=N; i++){
        for(int j=1; j<=M; j++){
            if(ed[i][j]==0){
                 vs[i][j]=1;
                 mark(i,j);
                }
            }
        }
    
    for(int i=1; i<=N; i++){
        if(ed[i][0]=1){
            q.push({i,0,1});
        }
    }
    while(!q.empty()){
        int x,y,t;
        tie(y,x,t)=q.front();
        q.pop();
        if(vs[y][x])continue;
        vs[y][x]=1;
        for(int i=0; i<4; i++){
            int nx=x+xx[i];
            int ny=y+yy[i];
            if(nx<1 || ny<1 || nx>N || ny>M)continue;
            if(vs[ny][nx])continue;
            ct[ny][nx]=t;
            q.push({ny,nx,t+1});
        }
    }
    int mn=100005;
    for(int i=1; i<=N; i++){
        if(mn>ct[i][M] && ct[i][M]!=0)mn=ct[i][M];
    }
    if(mn==100005)cout<<-1<<endl;
    else cout<<mn<<endl;
    return 0;
}