Submission
Status:
[PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP]
Subtask/Task Score:
{100/100}
Score: 100
User: Zonezonee
Problemset: ย่องเบาหลบกับระเบิด
Language: cpp
Time: 0.115 second
Submitted On: 2025-12-07 14:20:29
#include <bits/stdc++.h>
using namespace std;
const int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};
int a[1010][1010], n, m, dist[1010][1010];
bool valid(int x, int y){
bool bomb = false;
for(int i = -1; i <= 1; ++i){
for(int j = -1; j <= 1; ++j){
if(x+i <= 0 || y+j <= 0 || x+i > n || y+j > m) continue;
if(a[x+i][y+j] == 0) bomb = 1;
}
}
return (x > 0 && y > 0 && x <= n && y <= m && !bomb);
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
queue<tuple<int, int, int>> q;
memset(dist, 0x1f, sizeof dist);
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= m; ++j){
if(j == 1) q.push({i, j, dist[i][j] = 1});
cin >> a[i][j];
}
}
while(!q.empty()){
auto [x, y, d] = q.front(); q.pop();
for(int i = 0; i < 4; ++i){
int xx = x+dx[i], yy = y+dy[i];
if(valid(xx, yy)){
if(dist[xx][yy] > d+1)
q.push({xx, yy, dist[xx][yy] = d+1});
}
}
}
int ans = 1e7;
for(int i = 1; i <= n; ++i){
ans = min(ans, dist[i][m]);
}
cout << (ans == 1e7 ? -1 : ans) << '\n';
}