백준 3055 탈출
본문 바로가기
알고리즘 모음집/알고리즘 (Algorithm)

백준 3055 탈출

by KyeongMin 2019. 9. 9.
728x90
반응형

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

 

3055번: 탈출

문제 사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제일 친한 친구인 비버의 굴로 가능한 빨리 도망가 홍수를 피하려고 한다. 티떱숲의 지도는 R행 C열로 이루어져 있다. 비어있는 곳은 '.'로 표시되어 있고, 물이 차있는 지역은 '*', 돌은 'X'로 표시되어 있다. 비버의 굴은 'D'로, 고슴도치의 위치는 'S'로 나

www.acmicpc.net

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
#include<stdio.h>
#include<queue>
#define RSIZE 50
#define CSIZE 50
using namespace std;
char input[RSIZE][CSIZE];
int chk[RSIZE][CSIZE];
int dy[] = { 0,1,0,-1 };
int dx[] = { 1,0,-1,0 };
int R, C;
struct Data {
    int y, x, cnt;
};
queue<Data>wq;
queue<Data>q;
int ey, ex;
 
void init() {
    scanf("%d %d"&R, &C);
    for (int i = 0; i < R; i++) {
        for (int j = 0; j < C; j++) {
            scanf(" %1c"&input[i][j]);
            if (input[i][j] == '*') {
                chk[i][j] = 1;
                q.push({ i,j ,0 });
            }
            if (input[i][j] == 'D') {
                ey = i; ex = j;
            }
        }
    }
    for (int i = 0; i < R; i++) {
        for (int j = 0; j < C; j++) {
            if (input[i][j] == 'S') {
                chk[i][j] = 1;
                q.push({ i,j,0 });
            }
        }
    }
}
void safeGo() {
 
    while (q.size() != 0) {
        Data c = q.front(); q.pop();
        if (input[c.y][c.x] == '*') {
            for (int dir = 0; dir < 4; dir++) {
                Data n = c;
                n.y += dy[dir]; n.x += dx[dir]; n.cnt++;
                if (0 <= n.y && n.y < R && 0 <= n.x && n.x < C) {
                    if (chk[n.y][n.x] == 0 && input[n.y][n.x] == '.' && input[n.y][n.x] != 'X' 
&& input[n.y][n.x] != 'S' && input[n.y][n.x] != 'D') {
                        input[n.y][n.x] = '*';
                        chk[n.y][n.x] = 1;
                        q.push(n);
                    }
                }
            }
        }
        if (input[c.y][c.x] == 'S') {
            for (int dir = 0; dir < 4; dir++) {
                Data n = c;
                n.y += dy[dir]; n.x += dx[dir]; n.cnt++;
                if (0 <= n.y && n.y < R && 0 <= n.x && n.x < C) {
                    if (chk[n.y][n.x] == 0 && input[n.y][n.x] != 'X' && input[n.y][n.x] != '*') {
                        input[n.y][n.x] = 'S';
                        chk[n.y][n.x] = n.cnt;
                        q.push(n);
                    }
                }
            }
        }
    }
 
}
int main(void) {
    init();
    safeGo();
    if (chk[ey][ex] == 0) {
        printf("KAKTUS\n");
    }
    else
    printf("%d\n", chk[ey][ex]);
    return 0;
}
 
 

일단 큐랑 같지만 조금 다른건 물의 위치를 큐에 먼저넣고 고슴도치의 위치를 그뒤에큐에 넣고 한큐에서

물의 위치와 고슴도치인 경우를 나누어 탐색을 진행하였습니다. 

 

물이 이동 할 수 있는 방향은

고슴도치의 이동할수 있는 방향은

위와 같이 문제의 조건에 맞추어 해주면된다. 물의 경우 일반적으로  . 이면 가능하고 X인 벽이 아니여야하고 S가 갈수 있는길 D 목적지를 넘어서는 안되기 때문에 위와같이 조건을 주었고

 

고슴도치의 경우도 X 벽이 아니여야하고 물인쪽은 못가게 설계를 하였습니다.

 

그리고 미리 저장한 D의  y, x 값을 이용하여 chk[y][x] 가 0 이라면 고슴도치가 결승점에 못들어 간것이기 때문에 

KAKTUS 를 출력하고 

그게 아니면 chk[y][x]에 저장된 값을 출력하면됩니다.

 

TMI 지만 KAKTUS가 무엇인지 찾아보았습니다.

시간 안에 못갔다고 고슴도치가 소리지는것인지 모르겠습니다.

무튼 오늘은 여기까지이고 항상 즐거운 코딩하세요.

728x90
반응형

'알고리즘 모음집 > 알고리즘 (Algorithm)' 카테고리의 다른 글

백준 2174 로봇 시뮬레이션  (0) 2019.09.09
백준 2529 부등호  (0) 2019.09.09
백준 16985 Maaaaaaaaaze  (0) 2019.09.09
백준 11559 puyo puyo  (0) 2019.09.08
백준 16197 두 동전  (0) 2019.09.08

댓글