Submission
Status:
[PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP]
Subtask/Task Score:
{100/100}
Score: 100
User: tha_smith
Problemset: ย่องเบาหลบกับระเบิด
Language: cpp
Time: 0.045 second
Submitted On: 2026-03-07 19:38:55
#include <bits/stdc++.h>
using namespace std;
int dp[1005][1005],N,M,n,d[4][2]={{-1,0},{0,-1},{0,1},{1,0}};
bool vis[1005][1005],grid[1005][1005];
queue<pair<int,int>> q;
int main() {
ios_base::sync_with_stdio(0),cin.tie(0);
cin >> N >> M;
for(int i=1; i<=N; i++) {
for(int j=1; j<=M; j++) {
cin >> n;
if(n==0) {
grid[i][j] = grid[i-1][j-1] = grid[i-1][j] = grid[i-1][j+1] = grid[i][j-1] = grid[i][j+1] = grid[i+1][j-1] = grid[i+1][j] = grid[i+1][j+1] = 1;
vis[i][j] = vis[i-1][j-1] = vis[i-1][j] = vis[i-1][j+1] = vis[i][j-1] = vis[i][j+1] = vis[i+1][j-1] = vis[i+1][j] = vis[i+1][j+1] = 1;
}
}
}
for(int i=1; i<=N; i++) {
if(grid[i][1])
continue;
q.push({i,1});
vis[i][1]=1;
}
while(!q.empty()) {
auto[x,y] = q.front();
q.pop();
for(int k=0; k<4; k++) {
int nx = x+d[k][0];
int ny = y+d[k][1];
if(nx<1 || ny<1 || nx>N || ny>M)
continue;
if(vis[nx][ny] || grid[nx][ny])
continue;
vis[nx][ny]=1;
dp[nx][ny] = dp[x][y]+1;
q.push({nx,ny});
}
}
int ans = INT_MAX;
for(int i=1; i<=N; i++) {
if(dp[i][M]==0)
continue;
ans=min(ans,dp[i][M]);
}
if(ans==INT_MAX) {
cout << -1;
}
else {
cout << ans+1;
}
}