끄적끄적 코딩
article thumbnail
Published 2019. 11. 10. 02:27
[C++] 백준 4179번 불! 알고리즘
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;
}

검색 태그