728x90
BFS로 문제를 해결했습니다.
지훈이가 불을 피해서 탈출할 수 있는지 찾는 문제입니다.
불은 1분마다 상하좌우로 번지며,
지훈이는 상하좌우로 이동 할 수 있습니다.
불이 번지는 곳을 '#' (벽)으로 만들어주었고
지훈이는 방문한 곳을 다시 방문하지 않습니다.
최종적으로 밖으로 나오게 되는 경우 카운트를 출력하고,
벽에 막혀서 이동할 수 있는 곳이 없게되면 IMPOSSIBLE을 출력했습니다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
bool flag = false;
int n, m;
int turn = 1;
int result = 0;
bool visit[1010][1010];
char map[1010][1010];
int movement[4][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } };
queue<pair<pair<int, int>, int> > jh;
queue<pair<int, int> > fire;
int main(int argc, char *argv[])
{
cin >> n >> m;
memset(visit, false, sizeof(visit));
memset(map, ' ', sizeof(map));
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
cin >> map[i][j];
if (map[i][j] == 'J') {
map[i][j] = '.';
jh.push(make_pair(make_pair(i, j), 1));
visit[i][j] = true;
}
if (map[i][j] == 'F') {
map[i][j] = '#';
fire.push(make_pair(i, j));
}
}
}
while (!jh.empty()) {
int jx = jh.front().first.second;
int jy = jh.front().first.first;
int jc = jh.front().second;
jh.pop();
if (turn == jc) {
int cycle = fire.size();
for (int i = 0; i < cycle; ++i) {
int fx = fire.front().second;
int fy = fire.front().first;
fire.pop();
for (int j = 0; j < 4; ++j) {
int nextFx = fx + movement[j][1];
int nextFy = fy + movement[j][0];
if (map[nextFy][nextFx] == '.') {
fire.push(make_pair(nextFy, nextFx));
map[nextFy][nextFx] = '#';
}
}
}
++turn;
}
for (int i = 0; i < 4; ++i) {
int nextJx = jx + movement[i][1];
int nextJy = jy + movement[i][0];
if (map[nextJy][nextJx] == ' ') {
flag = true;
result = jc;
break;
}
if (!visit[nextJy][nextJx] && map[nextJy][nextJx] == '.') {
visit[nextJy][nextJx] = true;
jh.push(make_pair(make_pair(nextJy, nextJx), jc + 1));
}
}
if (flag) {
break;
}
}
if (!flag) {
cout << "IMPOSSIBLE" << endl;
}
else {
cout << result << endl;
}
return 0;
}
'알고리즘' 카테고리의 다른 글
[C++] 백준 14442번 벽 부수고 이동하기 2 (0) | 2019.11.11 |
---|---|
[C++] 백준 1600번 말이 되고픈 원숭이 (0) | 2019.11.11 |
[C++] 백준 1035번 조각 움직이기 (0) | 2019.11.08 |
[C++] 백준 15707번 exceed or not (0) | 2019.11.07 |
[C++] 백준 17626번 Four Squares (0) | 2019.11.07 |