티스토리 뷰

알고리즘/BOJ

[백준] 5427 불

세진짱 2018. 7. 4. 22:44


상근이가 빌딩에서 탈출하는 가장 빠른 시간을 구해야 한다

시물레이션으로 생각해서 bfs를 돌려봤다


불부터 먼저 이동하고 그다음에 상근이가 이동한다

상근이의 이동 거리를 구해두고 

만약 상근이가 탈출지점 까지 올 수 있다면 거리를 출력한다!


코드가 더럽다 ㅎㅎ 억지로 짠 느낌이 든다


소스코드

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
#include <iostream>
#include <queue>
#include <string>
#include <algorithm>
#include <cstring>
using namespace std;
int t, n, m;
int inf = 1000000000;
char map[1010][1010];
int dist[1010][1010];
bool  fcheck[1010][1010];
bool scheck[1010][1010];
int dx[4= { 0,0,-1,1 };
int dy[4= { 1,-1,0,0 };
 
int main() {
    scanf("%d"&t);
    while (t--) {
        int from_x = 0, from_y = 0;
        int to_x = 0, to_y = 0;
        queue<pair<intint>> fq, sq;
        memset(map, 0sizeof(map));
        memset(dist, 0sizeof(dist));
        memset(fcheck, 0sizeof(fcheck));
        memset(scheck, 0sizeof(scheck));
        scanf("%d %d"&m, &n);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                scanf(" %1c"&map[i][j]);
                if (map[i][j] == '@') {
                    sq.push({ i,j });
                    dist[i][j] = 1;
                    scheck[i][j] = true;
                }
                if (map[i][j] == '*') {
                    fq.push({ i,j });
                    fcheck[i][j] = true;
                }
            }
        }
        while (true) {
            int fz = fq.size();
            int sz = sq.size();
            if (sz == 0 && fz == 0break;
 
            while (fz--) {
                int x = fq.front().first;
                int y = fq.front().second;
                fq.pop();
 
                for (int i = 0; i < 4; i++) {
                    int nx = x + dx[i];
                    int ny = y + dy[i];
                    if (0 <= nx && nx < n && 0 <= ny && ny < m) {
                        if (map[nx][ny] == '#'continue;
                        if (fcheck[nx][ny]) continue;
                        fcheck[nx][ny] = true;
                        map[nx][ny] = '*';
                        fq.push({ nx,ny });
                    }
                }
            }
 
            while (sz--) {
                int x = sq.front().first;
                int y = sq.front().second;
                sq.pop();
 
                for (int i = 0; i < 4; i++) {
                    int nx = x + dx[i];
                    int ny = y + dy[i];
                    if (0 <= nx && nx < n && 0 <= ny && ny < m) {
                        if (map[nx][ny] == '*'continue;
                        if (map[nx][ny] == '#'continue;
                        if (scheck[nx][ny]) continue;
                        scheck[nx][ny] = true;
                        dist[nx][ny] = dist[x][y] + 1;
                        sq.push({ nx,ny });
                    }
                }
            }
        }
        int ans = inf;
        for (int i = 0; i < m; i++) {
            if (dist[0][i] != 0 && ans > dist[0][i])
                ans = dist[0][i];
            if (dist[n - 1][i] != 0 && ans > dist[n - 1][i])
                ans = dist[n - 1][i];
        }
        for (int i = 0; i < n; i++) {
            if (dist[i][0!= 0 && ans > dist[i][0])
                ans = dist[i][0];
            if (dist[i][m - 1!= 0 && ans > dist[i][m - 1])
                ans = dist[i][m - 1];
        }
        if (ans == inf) puts("IMPOSSIBLE");
        else printf("%d\n", ans);
    }
    return 0;
}
cs


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

[백준] 11723 집합  (2) 2018.07.05
[백준] 9328 열쇠  (0) 2018.07.04
[백준] 2146 다리 만들기  (4) 2018.07.04
[백준] 14595 동방 프로젝트(Large)  (0) 2018.07.04
[백준] 15352 욱제와 그의 팬들  (1) 2018.07.04
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
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
글 보관함