https://www.acmicpc.net/problem/4179
아이디어:
1. 불에 대한 BFS와 지훈이에 대한 BFS를 따로 진행
2. 'F'를 모두 찾고 거리(= 시간)를 기록하는 BFS 수행
3. J를 찾고 'F' 도착시간보다 늦거나 같이 도착하는 경우, 이미 불이 지나간 경우를 검사하면서 거리(= 시간)를 기록하는 BFS 수행
4. J의 BFS 도중 범위를 벗어나면 탈출한 것으로 거리(= 시간)를 출력하며 종료
초기 'J'의 위치가 i = 0, i = n - 1, j = 0, j = m - 1인 경우일 때 바로 return하는 풀이
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
char board[1001][1001];
int vis[1001][1001];
int fire[1001][1001];
int dx[4] = { 1, 0, -1, 0 };
int dy[4] = { 0, 1, 0, -1 };
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
for (int i = 0; i < 1001; i++) {
fill(board[i], board[i] + 1001, '#');
}
int n, m;
string tmp;
queue<pair<int, int>> Q;
cin >> n >> m;
for (int i = 0;i < n;i++) {
cin >> tmp;
int j = 0;
for (auto x : tmp) {
board[i][j] = x;
j++;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (board[i][j] == 'F') {
fire[i][j] = 1;
Q.push({ i, j });
}
}
}
while (!Q.empty()) {
pair<int, int> cur = Q.front();
Q.pop();
for (int dir = 0; dir < 4; dir++) {
int nx = cur.first + dx[dir];
int ny = cur.second + dy[dir];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
if (fire[nx][ny] != 0 || board[nx][ny] != '.') continue;
fire[nx][ny] = fire[cur.first][cur.second] + 1;
Q.push({ nx, ny });
}
}
while (!Q.empty()) Q.pop();
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (board[i][j] == 'J') {
if (i == 0 || i == n - 1 || j == 0 || j == m - 1) {
cout << 1;
return 0;
}
vis[i][j] = 1;
Q.push({ i, j });
}
}
}
while (!Q.empty()) {
pair<int, int> cur = Q.front();
Q.pop();
for (int dir = 0; dir < 4; dir++) {
int nx = cur.first + dx[dir];
int ny = cur.second + dy[dir];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) {
cout << vis[cur.first][cur.second];
return 0;
};
if (vis[nx][ny] != 0 || board[nx][ny] != '.') continue;
if (vis[cur.first][cur.second] + 1 >= fire[nx][ny] && fire[nx][ny] > 0) continue;
vis[nx][ny] = vis[cur.first][cur.second] + 1;
Q.push({ nx, ny });
}
}
cout << "IMPOSSIBLE";
return 0;
}
'algorithm' 카테고리의 다른 글
백준 1012번 유기농 배추 (0) | 2025.04.11 |
---|---|
백준 1697번 숨바꼭질 (0) | 2025.04.11 |
백준 7576번 토마토 (0) | 2025.04.06 |
백준 2178번 미로 탐색 (0) | 2025.04.05 |
백준 1926번 그림 (0) | 2025.04.05 |