반응형
문제를 읽는데,, 어제 푼 문제랑 너무 똑같다는 생각이 들었고, 정말 고민도 없이 곧바로 코딩을 시작한 뒤 풀 수 있었다.
어제 푼 골드4문제(5427번)와 똑같은 유형의 골드4문제였다.
풀이는 매우 똑같으니..! 풀이 설명은 해당 링크에 자세히 설명되어 있다!
물의 위치를 큐에 전부 먼저 넣어준 뒤에, 고슴도치의 위치를 넣어주고 그 다음에 bfs를 시작하면 된다.
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int N, M;
char MAP[50][50];
int VISIT[50][50]; // -1 : 소굴, 1 : 고슴도치, 2 : 물, 3 : 돌
int DEPTH[50][50]; // 도치의 움직임 depth
vector<pair<int, int>> water;
queue<pair<int, pair<int, int>>> que;
int SX, SY; // 고슴도치의 위치
int DX, DY; // 비버의 굴의 위치
int mx[4] = {0, 0, -1, 1};
int my[4] = {1, -1, 0, 0};
int bfs() {
while(!que.empty()) {
int type = que.front().first;
int x = que.front().second.first;
int y = que.front().second.second;
que.pop();
for(int i = 0; i < 4; i++) {
int tx = x + mx[i];
int ty = y + my[i];
if(tx < 0 || tx >= N || ty < 0 || ty >=M) // 맵 자체를 벗어나는 것들 방지
continue;
switch (type) {
case 1: // 도치의 움직임. 도치가 왔던곳 = 1 && 물인곳 = 2 && 돌인곳 = 3 뺴고 가능 => 0보다 작을 경우 가능
if(VISIT[tx][ty] <= 0) { // 미방문(0)이거나 || 소굴(-1)이거나
que.push({1, {tx, ty}});
VISIT[tx][ty] = 1;
DEPTH[tx][ty] = DEPTH[x][y] + 1;
}
if(tx == DX && ty == DY) // 도착점인 소굴에 도착했다.
return DEPTH[tx][ty];
break;
case 2: // 물의 움직임. 물이 왔던곳 == 2 && 돌인곳 == 3 && 소굴 == -1 빼고 가능 => 0이거나 1인경우 가능
if(VISIT[tx][ty] == 0 || VISIT[tx][ty] == 1) {
que.push({2, {tx, ty}});
VISIT[tx][ty] = 2;
}
break;
}
}
}
return -1;
}
int main() {
cin >> N >> M;
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
cin >> MAP[i][j];
switch(MAP[i][j]) {
case 'D': // 소굴
DX = i; DY = j;
VISIT[i][j] = -1;
break;
case 'S': // 도치
SX = i; SY = j;
VISIT[i][j] = 1;
break;
case '*':
water.push_back({i, j});
VISIT[i][j] = 2; // water
break;
case 'X':
VISIT[i][j] = 3; // ROCK
break;
}
}
}
int W_S = water.size();
for(int i = 0; i < W_S; i++) // 물들 넣고
que.push({2, {water[i].first, water[i].second}});
// 도치찡 넣고
que.push({1, {SX, SY}});
int V = bfs();
if(V == -1)
cout << "KAKTUS\n";
else
cout << V << "\n";
}
한번에 깔끔하게 통과했다!
소요 시간 : 20분
반응형
'[백준]' 카테고리의 다른 글
[BaekJoon/백준] 14499번 주사위 굴리기 (0) | 2022.07.21 |
---|---|
[BaekJoon/백준] 9207번 페그 솔리테어 (0) | 2022.07.20 |
[BaekJoon/백준] 5427번 불 (0) | 2022.07.18 |
[BaekJoon/백준] 2234번 성곽 (0) | 2022.07.17 |
[BaekJoon/백준] 14923번 미로 탈출 (0) | 2022.07.16 |