Submission

Status:

[PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP]

Subtask/Task Score:

{100/100}

Score: 100

User: exoworldgd

Problemset: ย่องเบาหลบกับระเบิด

Language: cpp

Time: 0.099 second

Submitted On: 2025-12-07 13:42:32

#pragma GCC optimize("O5,unroll-loops,inline,fast-math")
#pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
#include <bits/stdc++.h>
#define int long long
#define exoworldgd cin.tie(0)->sync_with_stdio(0), cout.tie(0)
using namespace std;
const int inf=LLONG_MAX, N=1005, dx[]={-1,1,0,0},dy[]={0,0,-1,1},ddx[]={-1,-1,-1,0,0,1,1,1},ddy[]={-1,0,1,-1,1,-1,0,1};
int n,m,grid[N][N],safe[N][N],dist[N][N],ans=inf;
signed main(void){
	exoworldgd;
	cin >> n >> m,memset(dist,-1,sizeof(dist));
	for (int i=0; i< n; i++)for (int j=0 ; j< m; j++) cin >> grid[i][j];
	for (int i=0; i< n;i ++) {
		for (int j=0; j<m ;j++) {
			if (!grid[i][j]) {safe[i][j]=0; continue;}
			safe[i][j]=1;
			for (int k=0; k< 8; k++) {
				int nx=i+ddx[k], ny=j+ddy[k];
				if (nx>=0 && nx<n && ny>=0 && ny<m && !grid[nx][ny]) safe[i][j]=0;
			}
		}
	}
	queue<pair<int,int>> q;
	for (int i=0; i< n; i++) if (safe[i][0]) dist[i][0]=1, q.emplace(i,0);
	while (!q.empty()) {
		auto [x,y]=q.front(); q.pop();
		for (int i=0;i < 4;i ++) {
			int nx=x+dx[i], ny=y+dy[i];
			if (nx<0||nx>=n||ny<0||ny>=m||!safe[nx][ny]||dist[nx][ny]^-1) continue;
			dist[nx][ny]=dist[x][y]+1, q.emplace(nx,ny);
		}
	}
	for (int i=0; i<n ;i++) if (dist[i][m-1]^-1) ans=min(ans,dist[i][m-1]);
	cout << (ans==inf ? -1 : ans);
}