본문 바로가기

알고리즘/SW EXPERT

4206. 연구소 탈출

4206. 연구소 탈출


이전에 백준에서 비슷한 문제를 풀어본 적 있었던 것 같다.


예전에 백준에서 내가 풀 때는 맵을 두개를 만들고, 서로 비교하면서 문제를 풀었는데 풀고나서 다른 사람들 풀이를 보다가


BFS를 서로 번갈아가면서 풀었던 코드를 봤던게 생각났다.


이 문제도 마찬가지로 사람이 움직이고, 바이러스를 움직이면서 탈출 여부를 판단하면 된다.


사람이 맵의 끝자리에 있으면 탈출할 수 있다. (단, 그 자리가 탈출하기 직전에 바이러스에게 먹히면 안된다.)


바이러스에게 먹히면 안되는 것을 간과해서 문제를 틀렸었다.


그리고 탈출하지 못하면, 전체 맵을 탐색하면서 사람이 남아있는지를 파악한다. (맵에 3의 존재 여부)


3이 존재한다면, 좀비는 되지 않았지만 탈출할 수 없는 구조이기 때문에 CANNOT ESCAPE 를 출력하면 된다.


<정답 코드>


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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include<iostream>
#include<queue>
 
using namespace std;
 
int map[8][8];
int dx[4= { 0,0,1,-1 };
int dy[4= { 1,-1,0,0 };
 
int main()
{
    //freopen("input.txt", "r", stdin);
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    int tc;
    cin >> tc;
 
    for (int t = 1; t <= tc; t++)
    {
        int h, w;
        queue<pair<intint>> v, s;
        cin >> h >> w;
        for (int i = 0; i < h; i++)
        {
            for (int j = 0; j < w; j++)
            {
                cin >> map[i][j];
                if (map[i][j] == 3)
                {
                    s.push({ i,j });
                }
                else if (map[i][j] == 2)
                {
                    v.push({ i,j });
                }
            }
        }
 
        int ex, ey;
        int dist[8][8= { 0, };
        bool escape = false;
 
        //사람이 먼저 움직이고, 바이러스가 그 다음에 움직이고 -> 모두 BFS 이용
        while (!s.empty() || !v.empty())
        {
            int s_size = s.size();
            int v_size = v.size();
 
            //사람이 움직이는 BFS 
            for (int i = 0; i < s_size; i++)
            {
                int x = s.front().first;
                int y = s.front().second;
                s.pop();
 
                //탈출에 성공하는 경우
                if ((x == 0 || x == h - 1 || y == 0 || y == w - 1)&&map[x][y]!=2)
                {
                    ex = x, ey = y;
                    escape = true;
                    break;
                }
 
                for (int d = 0; d < 4; d++)
                {
                    int nx = x + dx[d];
                    int ny = y + dy[d];
                    if (nx >= 0 && ny >= 0 && nx < h && ny < w && dist[nx][ny] == 0 && map[nx][ny]==0)
                    {
                        map[nx][ny] = 3;
                        dist[nx][ny] = dist[x][y] + 1;
                        s.push({ nx,ny });
                    }
                }
            }
 
            if (escape)
            {
                break;
            }
 
            //바이러스가 움직이는 BFS
 
            for (int i = 0; i < v_size; i++)
            {
                int x = v.front().first;
                int y = v.front().second;
                v.pop();
 
                for (int d = 0; d < 4; d++)
                {
                    int nx = x + dx[d];
                    int ny = y + dy[d];
                    if (nx >= 0 && ny >= 0 && nx < h && ny < w && map[nx][ny] != 1 && map[nx][ny]!=2)
                    {
                        map[nx][ny] = 2;
                        dist[nx][ny] = dist[x][y] + 1;
                        v.push({ nx,ny });
                    }
                }
            }
 
        }
 
        //탈출했을 때
        if (escape)
        {
            cout << "#" << t << " " << dist[ex][ey] + 1 << "\n";
        }
        //탈출하지 못했을 때
        else
        {
            bool zombie = true;
            for (int i = 0; i < h; i++)
            {
                for (int j = 0; j < w; j++)
                {
                    //map 에 3이 남아있으면 좀비가 되지 않음.
                    if (map[i][j] == 3)
                    {
                        zombie = false;
                    }
                }
            }
 
            if (zombie)
            {
                cout << "#" << t << " " << "ZOMBIE\n";
            }
            else
            {
                cout << "#" << t << " " << "CANNOT ESCAPE\n";
            }
        }
    }
    return 0;
}
cs


반응형

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

4751. 다솔이의 다이아몬드 장식  (0) 2018.07.17
3421. 수제 버거 장인  (0) 2018.04.10
4193. 수영대회 결승전  (0) 2018.04.09
3977. 페르마의 크리스마스 정리  (0) 2018.04.06
1249.보급로  (0) 2018.04.06