Submission
Status:
[PPPPPPPPTSSSSSSSSSSSSSSSSSSSSSSSSSSS]
Subtask/Task Score:
{0/100}
Score: 0
User: kavin8888
Problemset: ย่องเบาหลบกับระเบิด
Language: cpp
Time: 1.089 second
Submitted On: 2025-10-16 01:06:05
#include <bits/stdc++.h>
using namespace std;
#define MAX_N 1000
vector<vector<bool>> board(MAX_N, vector<bool>(MAX_N, false));
vector<vector<int>> dist(MAX_N, vector<int>(MAX_N, INT_MAX));
int n, m;
// x = row, y = col
bool isInRange(int x, int y) { return (0 <= x && x < n && 0 <= y && y < m); }
// x = row, y = col
bool isValid(int x, int y) {
bool chk = true;
for (int i = x - 1; i <= x + 1; i++) {
for (int j = y - 1; j <= y + 1; j++) {
if (isInRange(i, j) && !board[i][j]) {
chk = false;
break;
}
}
}
return chk;
}
// x = row, y = col
void search(int x, int y) {
// Move Down
if (isInRange(x + 1, y) && board[x + 1][y] && isValid(x + 1, y) &&
dist[x][y] + 1 < dist[x + 1][y]) {
dist[x + 1][y] = dist[x][y] + 1;
search(x + 1, y);
}
// Move Up
if (isInRange(x - 1, y) && board[x - 1][y] && isValid(x - 1, y) &&
dist[x][y] + 1 < dist[x - 1][y]) {
dist[x - 1][y] = dist[x][y] + 1;
search(x - 1, y);
}
// Move Right
if (isInRange(x, y + 1) && board[x][y + 1] && isValid(x, y + 1) &&
dist[x][y] + 1 < dist[x][y + 1]) {
dist[x][y + 1] = dist[x][y] + 1;
search(x, y + 1);
}
// Move Left
if (isInRange(x, y - 1) && board[x][y - 1] && isValid(x, y - 1) &&
dist[x][y] + 1 < dist[x][y - 1]) {
dist[x][y - 1] = dist[x][y] + 1;
search(x, y - 1);
}
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int x;
cin >> x;
board[i][j] = (x == 1 ? true : false);
}
}
for (int i = 0; i < n; i++) {
if (board[i][0] && isValid(i, 0)) {
dist[i][0] = 0;
search(i, 0);
}
}
int ans = INT_MAX;
for (int i = 0; i < n; i++) {
ans = min(ans, dist[i][m - 1]);
}
if (ans == INT_MAX) {
cout << "-1\n";
} else {
cout << ans + 1 << '\n';
}
return 0;
}