Submission
Status:
[PPPPPPPP-SSSSSSSSSSSSSSSSSSSSSSSSSSS]
Subtask/Task Score:
{0/100}
Score: 0
User: raidina
Problemset: ย่องเบาหลบกับระเบิด
Language: cpp
Time: 0.045 second
Submitted On: 2026-03-06 22:20:00
#include <iostream>
#include <queue>
#include <utility>
#include <limits.h>
using namespace std;
const int N = 1002;
int n,m;
long long arr[N][N],dp[N][N];
bool visited[N][N];
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 >> arr[i][j];
for(int i = 1;i<=n;i++)
for(int j = 1;j<=m;j++)
dp[i][j]= INT_MAX;
for(int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
if(arr[i][j]== 0 && !visited[i][j]){
for(int a = -1;a<=1;a++){
for(int b = -1;b<=1;b++){
int nx = i+a;
int ny = j+b;
if(nx<1 || nx >n || ny<1||ny>n)continue;
if(visited[nx][ny])continue;
arr[nx][ny]=0;
visited[nx][ny]=true;
}
}
}
}
}
for(int i = 1;i<=n;i++){
if(arr[i][1]!=0)q.push({i,1});
dp[i][1]=1;
}
while(!q.empty()){
int x = q.front().first;
int y = q.front().second;
q.pop();
if(visited[x][y])continue;
visited[x][y] = true;
int d1[4]={-1,1,0,0};
int d2[4]={0,0,-1,1};
for(int j = 0;j<4;j++){
int nx = x+d1[j];
int ny = y+d2[j];
if(nx<1 || nx >n || ny<1||ny>n)continue;
if(!visited[nx][ny] && arr[nx][ny]==1){
if(dp[x][y]+1 < dp[nx][ny]){
dp[nx][ny]=dp[x][y]+1;
q.push({nx,ny});
}
}
}
}
long long ans=INT_MAX;
for(int i = 1;i<=n;i++){
if(arr[i][n]==0)continue;
ans=min(dp[i][n],ans);
}
if(ans != INT_MAX)cout << ans;
else cout << -1;
}