몽셀통통의 블로그

[BaekJoon] 3055 탈출 :: monton 본문

프로그래밍/백준 문제 풀기

[BaekJoon] 3055 탈출 :: monton

몽통이 2018. 5. 30. 23:55


문제

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



풀이

가중치가 없고 최단 거리를 구하는 문제이므로 bfs 사용

일단 물이 들어가는 큐와 고슴도치의 위치를 담는 큐 이렇게 2개를 구성한 다음

큐에 물을 일단 담고 고슴도치 위치를 넣는다



코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <queue>
 
using namespace std;
 
int R, C,ans,flag;
char arr[51][51];
int smap[51][51];
int wmap[51][51];
int dir[4][2= { {-1,0},{0,1},{1,0},{0,-1} };
 
int main() {
    cin >> R >> C;
 
    queue <int> sx, sy, wx, wy;
 
    for (int i = 0; i < R; i++) {
        for (int j = 0; j < C; j++) {
            cin >> arr[i][j];
            if (arr[i][j] == 'S') sx.push(i), sy.push(j), smap[i][j] = 1;
            if (arr[i][j] == '*') wx.push(i), wy.push(j), wmap[i][j] = 1;
        }
    }
 
    while (!sx.empty()) {
        
        int wcnt = wx.size();
        while (wcnt--) {
            int x = wx.front();
            int y = wy.front();
            wx.pop(), wy.pop();
 
            for (int i = 0; i < 4; i++) {
                int nx = x + dir[i][0];
                int ny = y + dir[i][1];
 
                if (nx < 0 || nx >= R || ny < 0 || ny >= C) continue;
                if (wmap[nx][ny]||arr[nx][ny]=='*'|| arr[nx][ny] == 'D' || arr[nx][ny] == 'X'continue;
                wx.push(nx), wy.push(ny);
                wmap[nx][ny] = 1;
            }
        }
 
        int scnt = sx.size();
        while (scnt--) {
            int x = sx.front();
            int y = sy.front();
            sx.pop(), sy.pop();
 
            if (arr[x][y] == 'D') {
                flag = 1;
                break;
            }
 
            for (int i = 0; i < 4; i++) {
                int nx = x + dir[i][0];
                int ny = y + dir[i][1];
 
                if (nx < 0 || nx >= R || ny < 0 || ny >= C) continue;
                if (smap[nx][ny] || wmap[nx][ny]||arr[nx][ny] == '*' || arr[nx][ny] == 'X'continue;
                sx.push(nx), sy.push(ny);
                smap[nx][ny] = 1;
            }
        }
        if (flag) break;
        ans++;
    }
    if (flag) cout << ans;
    else cout << "KAKTUS";
}
cs



유사 문제

[BaekJoon] 5427 불 https://www.acmicpc.net/problem/5427