GitHubSeob

C++ / 백준 / 3055 / 탈출 본문

Baekjoon/Gold

C++ / 백준 / 3055 / 탈출

GitHubSeob 2022. 1. 23.

문제

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

 

3055번: 탈출

사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제

www.acmicpc.net

 

문제풀이

5427번 불과 유사한 문제이다.

물이 먼저 차오른 뒤 고슴도치가 움직인다.

고슴도치의 위치를 나타내는 loc큐, 물의 위치를 나타내는 water큐를 선언한다.

각 큐는 벡터로 구성되고 y좌표, x좌표, 몇 분이 지났는지를 나타낸다.

pre와 cnt, w_pre, w_cnt는 1분이 지났을 때 더 이상 while문이 돌지 않도록 하기 위해 분을 나타내는 변수이다.

while(1) 문을 실행하고 water큐가 비거나 w_pre가 w_cnt와 같지 않을 때(1분이 지날 때)까지 while문을 돌리면서 물이 차오를 수 있는 위치를 확인하고 물을 채운다. 그 뒤 y좌표, x좌표, 분을 큐에 집어넣는다.

1분이 지나 물이 모두 차오르면 while문을 통해 고슴도치를 움직인다.

1분 동안(한 칸) 모두 움직일 수 있는 위치를 확인하고 loc큐에 y좌표, x좌표, 분을 집어넣는다.

만약 다음칸이 D라면 분+1을 출력하고 종료한다.

고슴도치가 더 이상 이동할 수 없으면 KAKTUS를 출력하고 종료한다.

 

 

 

코드

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int dy[4] = { 0,0,-1,1 };
int dx[4] = { 1,-1,0,0 };

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	int R(0), C(0);
	cin >> R >> C;
	int y(0), x(0);
	vector<vector<char>>map(R, vector<char>(C, ' '));
	vector<vector<bool>>visit(R, vector<bool>(C, false));
	queue<vector<int>>water;
	queue<vector<int>>loc;

	for (y = 0; y < R; ++y) {
		for (x = 0; x < C; ++x) {
			cin >> map[y][x];
			if (map[y][x] == '*')
				water.push({ y,x,0 });
			else if (map[y][x] == 'S') {
				loc.push({ y,x,0 });
				visit[y][x] = true;
			}
		}
	}
	int pre(0), cnt(0);
	int w_pre(0), w_cnt(0);
	int idx(0);
	while (1) {
		while (!water.empty()) {
			y = water.front()[0];
			x = water.front()[1];
			w_cnt = water.front()[2];

			if (w_pre != w_cnt)
				break;
			
			else water.pop();
			for (idx = 0; idx < 4; ++idx) {
				int n_y(y + dy[idx]);
				int n_x(x + dx[idx]);
				if (n_y >= 0 && n_y < R && n_x >= 0 && n_x < C) {
					if (map[n_y][n_x] == '.' && !visit[n_y][n_x]) {
						map[n_y][n_x] = '*';
						water.push({ n_y,n_x,w_cnt + 1 });
					}
				}
			}			
		}
		w_pre = w_cnt;

		while (!loc.empty()) {
			y = loc.front()[0];
			x = loc.front()[1];
			cnt = loc.front()[2];
			if (pre != cnt)
				break;			
			else loc.pop();
			for (idx = 0; idx < 4; ++idx) {
				int n_y(y + dy[idx]);
				int n_x(x + dx[idx]);
				if (n_y >= 0 && n_y < R && n_x >= 0 && n_x < C) {
					if (map[n_y][n_x] == '.' && !visit[n_y][n_x]) {
						visit[n_y][n_x] = true;
						loc.push({ n_y,n_x,cnt + 1 });
					}
					else if (map[n_y][n_x] == 'D') {
						cout << cnt + 1;
						exit(0);
					}
				}
			}
		}
		pre = cnt;
		if (loc.empty()) break;
	}
	cout << "KAKTUS";
}

'Baekjoon > Gold' 카테고리의 다른 글

C++ / 백준 / 1039 / 교환  (0) 2022.01.30
C++ / 백준 / 16397 / 탈출  (0) 2022.01.24
C++ / 백준 / 5427 / 불  (0) 2022.01.23
C++ / 백준 / 6593 / 상범 빌딩  (0) 2022.01.22
C++ / 백준 / 15686 / 치킨 배달  (0) 2022.01.17