Submission
Status:
[PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP]
Score: 100
User: njoop
Problemset: ย่องเบาหลบกับระเบิด
Language: cpp
Time: 0.093 second
Submitted On: 2025-05-20 18:47:58
#include <bits/stdc++.h>
using namespace std;
int dx[8] = {1, 0, -1, 0, 1, -1, 1, -1}, dy[8] = {0, 1, 0, -1, 1, -1, -1, 1};
int arr[1010][1010], dis[1010][1010], n, m;
queue<tuple<int, int, int>> q;
int main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n >> m;
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
cin >> arr[i][j];
}
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
if(arr[i][j] == 0) {
for(int k=0; k<8; k++) {
if(arr[i+dx[k]][j+dy[k]] != 0) {
arr[i+dx[k]][j+dy[k]] = 2;
}
}
}
dis[i][j] = 1e9;
}
}
for(int i=1; i<=n; i++) {
if(arr[i][1] != 1) continue;
dis[i][1] = 1;
q.push({1, i, 1});
}
while(q.size()) {
int cd = get<0>(q.front()), cx = get<1>(q.front()), cy = get<2>(q.front());
q.pop();
if(dis[cx][cy] < cd) continue;
for(int i=0; i<4; i++) {
int nx = cx+dx[i], ny = cy+dy[i];
if(nx < 1 || nx > n || ny < 1 || ny > m) continue;
if(arr[nx][ny] == 1 && dis[nx][ny] > cd+1) {
dis[nx][ny] = cd+1;
q.push({cd+1, nx, ny});
}
}
}
int ans = 1e9;
for(int i=1; i<=n; i++) {
ans = min(ans, dis[i][m]);
}
if(ans == 1e9) cout << -1;
else cout << ans;
return 0;
}