Submission

Status:

[PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP]

Subtask/Task Score:

{100/100}

Score: 100

User: Neozaawwman1

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

Language: cpp

Time: 0.169 second

Submitted On: 2026-01-20 23:47:13

#include <bits/stdc++.h>
using namespace std;

int N,M;
int dx8[8]={-1,0,0,1,-1,-1,1,1};
int dy8[8]={0,-1,1,0,1,-1,1,-1};
int dx4[4]={-1,0,0,1};
int dy4[4]={0,-1,1,0};

int ed[1005][1005];
int block[1005][1005];
int dista[1005][1005];

void mark(int y, int x){
    for(int i=0;i<8;i++){
        int ny=y+dy8[i];
        int nx=x+dx8[i];
        if(ny<1 || nx<1 || ny>N || nx>M) continue;
        block[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];
        }
    }

    // mark ช่องอันตราย
    for(int i=1;i<=N;i++){
        for(int j=1;j<=M;j++){
            if(ed[i][j]==0){
                block[i][j]=1;
                mark(i,j);
            }
        }
    }

    queue<pair<int,int>> q;

    // เริ่มจากคอลัมน์ซ้าย
    for(int i=1;i<=N;i++){
        if(!block[i][1]){
            dista[i][1]=1;
            q.push({i,1});
        }
    }

    while(!q.empty()){
        auto [y,x]=q.front(); q.pop();
        for(int i=0;i<4;i++){
            int ny=y+dy4[i];
            int nx=x+dx4[i];
            if(ny<1 || nx<1 || ny>N || nx>M) continue;
            if(block[ny][nx] || dista[ny][nx]) continue;
            dista[ny][nx]=dista[y][x]+1;
            q.push({ny,nx});
        }
    }

    int ans=1e9;
    for(int i=1;i<=N;i++){
        if(dista[i][M]) ans=min(ans,dista[i][M]);
    }

    if(ans==1e9) cout<<-1;
    else cout<<ans;
}