본문 바로가기
CS/알고리즘

백준 5427 불 (bfs)

by zieunee 2019. 10. 1.
반응형

https://www.acmicpc.net/problem/5427

 

5427번: 불

문제 상근이는 빈 공간과 벽으로 이루어진 건물에 갇혀있다. 건물의 일부에는 불이 났고, 상근이는 출구를 향해 뛰고 있다. 매 초마다, 불은 동서남북 방향으로 인접한 빈 공간으로 퍼져나간다. 벽에는 불이 붙지 않는다. 상근이는 동서남북 인접한 칸으로 이동할 수 있으며, 1초가 걸린다. 상근이는 벽을 통과할 수 없고, 불이 옮겨진 칸 또는 이제 불이 붙으려는 칸으로 이동할 수 없다. 상근이가 있는 칸에 불이 옮겨옴과 동시에 다른 칸으로 이동할 수 있다. 빌딩

www.acmicpc.net

#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>
#include <queue>

using namespace std;

int w, h;
char map[1002][1002];
int visited[1002][1002];
int tc;
queue <pair<int, int>> q;
queue <pair<pair<int, int>, int>> q2;
int fireSize;
int personSize;
int dx[] = { 1,-1,0,0 };
int dy[] = { 0,0,1,-1 };
int ans;

void initAll() {
	for (int i = 0; i < 1002; i++) {
		for (int j = 0; j < 1002; j++) {
			map[j][i] = '.';
			visited[j][i] = 0;
		}
	}
}
void moving() {
	while (1) {
		fireSize = q.size();
		while (fireSize--) {

			int x = q.front().first;
			int y = q.front().second;
			q.pop();

			for (int i = 0; i < 4; i++) {
				int cx = x + dx[i];
				int cy = y + dy[i];

				if (map[cx][cy] == '.' && cx < w && cy < h && cx >= 0 && cy >= 0) {
					map[cx][cy] = '*';
					q.push(make_pair(cx, cy));
				}
			}
		}
		personSize = q2.size();
		while (personSize--) {
			int x = q2.front().first.first;
			int y = q2.front().first.second;
			int cnt = q2.front().second;
			q2.pop();

			if ((x == w - 1 || y == h - 1 || x == 0 || y == 0)) {
				//하나라도 끝이라면?
				if (cnt < ans) {
					ans = cnt;
					//break;
				}
			}
			for (int i = 0; i < 4; i++) {
				int cx = x + dx[i];
				int cy = y + dy[i];

				if (map[cx][cy] == '*' || map[cx][cy] == '#') continue;
				else if (map[cx][cy] == '.' && cx < w && cy < h && cx >= 0 && cy >= 0 && visited[cx][cy] == 0) {
					visited[cx][cy] = 1;
					q2.push(make_pair(make_pair(cx, cy), cnt + 1));
				}

			}

		}

		if (q2.empty() && q.empty()) {
			while (!q.empty()) {
				q.pop();
			}
			break;
		}

	}

}
int main() {

	scanf_s("%d", &tc);
	for (int t = 0; t < tc; t++) {
		ans = 987654321;
		fireSize = 0;
		personSize = 0;
		initAll();

		scanf_s("%d%d", &w, &h);
		for (int i = 0; i < h; i++) {
			for (int j = 0; j < w; j++) {
				cin >> map[j][i];
				visited[j][i] = 0;
				if (map[j][i] == '*') {
					q.push(make_pair(j, i));
				}
				else if (map[j][i] == '@') {
					q2.push(make_pair(make_pair(j, i), 0));
				}
			}
		}

		moving();

		if (ans == 987654321) 
			cout << "IMPOSSIBLE" << endl;
		else 
			cout << ans + 1 << endl;

	}
	return 0;
}

 

	if ((x == w - 1 || y == h - 1 || x == 0 || y == 0)) {
				//하나라도 끝이라면?
				if (cnt < ans) {
					ans = cnt;
					//break;
				}
			}

이 부분에서 엄청 헤맸습니다. 

 

if (map[x][y] = '.' && (x == w - 1 || y == h - 1 || x == 0 || y == 0)) {}

했기 때문 ..... 

 

이러면 

 

.

@

.

일때 답이 2가 나온다. 원래는 1인데..  '.'일 경우만 움직이기 때문에 위아래로 밖에 못움직인다. 

 

후..... 오랬동안 풀었네

반응형

'CS > 알고리즘' 카테고리의 다른 글

백준 1600 말이 되고픈 원숭이 (bfs , 사선)  (0) 2019.10.27
백준 1260 bfs 와 dfs  (0) 2019.10.27
백준 1726 로봇  (0) 2019.10.03
백준 미세먼지 안녕 17144  (0) 2019.09.27
지금까지 푼 알고리즘 문제(깃헙)  (0) 2018.11.19