# 생각
BFS를 두번 돌리면 된다
불에 대한 BFS 먼저 한번,
상근이에 대한 BFS 한번.
테스트 케이스가 여러개 주어지기 때문에 큐와 방문 배열 등의 초기화를 잘 해주어야 한다.
# 전체 코드
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
int TC, w, h;
int board[1002][1002];
int visF[1002][1002];
int visS[1002][1002];
int dx[4] = { 1,-1,0,0 };
int dy[4] = { 0,0,1,-1 };
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> TC;
for (int t = 0; t < TC; t++)
{
bool canEscape = false;
queue<pair<int, int>> qF = {}, qS = {};
cin >> h >> w;
for (int i = 0; i < w; i++)
{
fill(visF[i], visF[i] + h, 0);
fill(visS[i], visS[i] + h, 0);
}
for (int i = 0; i < w; i++)
{
for (int j = 0; j < h; j++)
{
char c;
cin >> c;
if (c == '#')
{
board[i][j] = -1;
}
else
{
if (c == '@')
{
qS.push({ i,j });
visS[i][j] = 1;
}
else if (c == '*')
{
qF.push({ i,j });
visF[i][j] = 1;
}
board[i][j] = 0;
}
}
}
while (!qF.empty())
{
auto cur = qF.front();
qF.pop();
for (int dir = 0; dir < 4; dir++)
{
int nx = cur.X + dx[dir];
int ny = cur.Y + dy[dir];
if (nx < 0 || w <= nx || ny < 0 || h <= ny) continue;
if (board[nx][ny] == -1) continue;
if (visF[nx][ny]) continue;
visF[nx][ny] = visF[cur.X][cur.Y] + 1;
qF.push({ nx,ny });
}
}
while (!qS.empty() && !canEscape)
{
auto cur = qS.front();
qS.pop();
for (int dir = 0; dir < 4; dir++)
{
int nx = cur.X + dx[dir];
int ny = cur.Y + dy[dir];
if (nx < 0 || w <= nx || ny < 0 || h <= ny)
{
cout << visS[cur.X][cur.Y] << "\n";
canEscape = true;
break;
}
if (board[nx][ny] == -1) continue;
if (visS[nx][ny]) continue;
if (visF[nx][ny] != 0 && visF[nx][ny] <= visS[cur.X][cur.Y] + 1) continue;
visS[nx][ny] = visS[cur.X][cur.Y] + 1;
qS.push({ nx,ny });
}
}
if (!canEscape)
{
cout << "IMPOSSIBLE" << '\n';
}
}
}
https://www.acmicpc.net/problem/5427
5427번: 불
상근이는 빈 공간과 벽으로 이루어진 건물에 갇혀있다. 건물의 일부에는 불이 났고, 상근이는 출구를 향해 뛰고 있다. 매 초마다, 불은 동서남북 방향으로 인접한 빈 공간으로 퍼져나간다. 벽에
www.acmicpc.net
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 11729_하노이 탑 이동 순서 with cpp (0) | 2022.01.27 |
---|---|
[BOJ] 1629_곱셈 with cpp (0) | 2022.01.25 |
[BOJ] 6593_상범 빌딩 with cpp (0) | 2022.01.23 |
[BOJ] 2468_안전 영역.cpp (0) | 2022.01.23 |
[BOJ] 5014_스타트링크 with cpp (0) | 2022.01.20 |