Submission
Status:
[PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP]
Subtask/Task Score:
{100/100}
Score: 100
User: krittaphot
Problemset: ย่องเบาหลบกับระเบิด
Language: cpp
Time: 0.100 second
Submitted On: 2026-03-07 11:52:06
#include <bits/stdc++.h>
using namespace std;
int dx[8] = {1,1,1,0,0,-1,-1,-1};
int dy[8] = {1,0,-1,1,-1,1,0,-1};
int DX[4] = {1,0,-1,0};
int DY[4] = {0,1,0,-1};
int main(){
int n,m;
cin >> n >> m;
vector<vector<int>> mp(n,vector<int>(m));
vector<vector<int>> dist(n,vector<int>(m,INT_MAX));
vector<vector<int>> check(n,vector<int>(m,1));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin >> mp[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mp[i][j] == 0){
check[i][j] = 0;
for(int k=0;k<8;k++){
int x = i + dx[k];
int y = j + dy[k];
if(x >= 0 && x < n && y >= 0 && y < m){
if(mp[x][y] == 1){
check[x][y] = 0;
}
}
}
}
}
}
// for(int i=0;i<n;i++){
// for(int j=0;j<m;j++){
// cout << check[i][j] << " ";
// }
// cout << endl;
// }
for(int i = 0;i<n;i++){
if(check[i][0] == 1){
dist[i][0] = 1;
}
}
queue<pair<int,int>> q;
for(int i = 0;i<n;i++){
if(check[i][0] == 1){
q.push({i,0});
}
}
while(!q.empty()){
auto 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];
int ny = y + DY[k];
if(nx >= 0 && nx < n && ny >= 0 && ny < m){
if(check[nx][ny] == 1 && dist[nx][ny] > dist[x][y] + 1){
dist[nx][ny] = dist[x][y] + 1;
q.push({nx,ny});
}
}
}
}
int ans = INT_MAX;
for(int i=0;i<n;i++){
if(check[i][m-1] == 1){
ans = min(ans,dist[i][m-1]);
}
}
if(ans == INT_MAX){
cout << -1 << endl;
}else
cout << ans << endl;
}