Submission
Status:
[PPPPPPPP-SSSSSSSSSSSSSSSSSSSSSSSSSSS]
Subtask/Task Score:
{0/100}
Score: 0
User: kimza
Problemset: ย่องเบาหลบกับระเบิด
Language: cpp
Time: 0.039 second
Submitted On: 2026-03-07 00:03:12
#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
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mp[i][j] == 0){
mp[i][j] = 2;
if(i+1<n) mp[i+1][j] = 2;
if(j+1<m) mp[i][j+1] = 2;
if(i-1>=0) mp[i-1][j] = 2;
if(j-1>=0) mp[i][j-1] = 2;
if(i+1<n && j+1<m) mp[i+1][j+1] = 2;
if(i-1>=0 && j-1>=0) mp[i-1][j-1] = 2;
if(i+1<n && j-1>=0) mp[i+1][j-1] = 2;
if(i-1>=0 && j+1<m) mp[i-1][j+1] = 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;
}