Submission
Status:
[PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP]
Subtask/Task Score:
{100/100}
Score: 100
User: Gump2011
Problemset: ย่องเบาหลบกับระเบิด
Language: cpp
Time: 0.062 second
Submitted On: 2026-03-08 17:49:17
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int N, M;
cin >> N >> M;
vector<vector<int>> a(N, vector<int>(M));
vector<vector<bool>> safe(N, vector<bool>(M, true));
vector<vector<int>> dist(N, vector<int>(M, -1));
for(int i=0;i<N;i++)
for(int j=0;j<M;j++)
cin >> a[i][j];
// mark ช่องรอบระเบิดไม่ปลอดภัย
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
if(a[i][j]==0){
for(int di=-1; di<=1; di++){
for(int dj=-1; dj<=1; dj++){
int ni = i + di, nj = j + dj;
if(ni>=0 && ni<N && nj>=0 && nj<M)
safe[ni][nj] = false;
}
}
}
}
}
// BFS
queue<pair<int,int>> q;
for(int i=0;i<N;i++){
if(safe[i][0]){
q.push(make_pair(i,0));
dist[i][0] = 1; // เริ่มนับช่องแรกด้วย
}
}
int dx[4] = {1,-1,0,0};
int dy[4] = {0,0,1,-1};
while(!q.empty()){
pair<int,int> cur = q.front(); q.pop();
int x = cur.first;
int y = cur.second;
for(int k=0;k<4;k++){
int nx = x + dx[k], ny = y + dy[k];
if(nx>=0 && nx<N && ny>=0 && ny<M && safe[nx][ny] && dist[nx][ny]==-1){
dist[nx][ny] = dist[x][y]+1;
q.push(make_pair(nx,ny));
}
}
}
int ans = INT_MAX;
for(int i=0;i<N;i++){
if(dist[i][M-1]!=-1) ans = min(ans, dist[i][M-1]);
}
if(ans==INT_MAX) cout << -1 << "\n";
else cout << ans << "\n";
return 0;
}