SDJ( 수돈재 아님 ㅎ )

[C++] 17836 - 공주님을 구해라! 본문

알고리즘/Backjoon

[C++] 17836 - 공주님을 구해라!

ShinDongJun 2020. 1. 15. 20:35

문제 링크 : https://www.acmicpc.net/problem/17836

 

17836번: 공주님을 구해라!

용사는 마왕이 숨겨놓은 공주님을 구하기 위해 (N, M) 크기의 성 입구 (1,1)으로 들어왔다. 마왕은 용사가 공주를 찾지 못하도록 성의 여러 군데 마법 벽을 세워놓았다. 용사는 현재의 가지고 있는 무기로는 마법 벽을 통과할 수 없으며, 마법 벽을 피해 (N, M) 위치에 있는 공주님을 구출해야만 한다. 마왕은 용사가 괴롭히기 위해 공주에게 저주를 걸었다. 저주에 걸린 공주는 T시간 이내로 용사를 만나지 못한다면 영원히 돌로 변하게 된다. 공주님을 구출

www.acmicpc.net

 

BFS로 공주까지의 거리를 구하고 만약 중간에 그람이 있다면 그 위치로부터 공주까지의 거리를 구한다.

그리고 나서 시간 T와 몇가지 조건을 확인해 결과를 출력한다.

 

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
#include<iostream>
#include<queue>
#include<utility>
 
using namespace std;
 
typedef pair<intint> pii;
typedef queue< pair<intint> > qpii;
 
bool visited[105][105];
int B[105][105];
int N, M, T;
int GRAM_X, GRAM_Y;
 
qpii Q;
 
void BFS()
{
    int Y[4= {001-1};
    int X[4= {1-100};
    int NY, NX;
    while(!Q.empty())
    {
        int y = Q.front().first;
        int x = Q.front().second;
 
        Q.pop();
 
        for(int i = 0!visited[y][x] && i < 4++i)
        {
            NY = y+Y[i];
            NX = x+X[i];
            
            if(0 <= NY && NY < N && 0 <= NX && NX < M)
            {
                if(B[NY][NX] != -1 && visited[NY][NX] == 0)
                {
                    B[NY][NX] = B[y][x] + 1;
                    Q.push(pii(NY, NX));
                }
            }
        }
 
        visited[y][x] = 1;
    }
 
}
 
int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    cin >> N >> M >> T;
 
    for(int i = 0; i < N; ++i)
    {
        for(int j = 0; j < M; ++j)
        {
            cin >> B[i][j];
            if(B[i][j] == 1)
                B[i][j]=-1;
            else if(B[i][j] == 2)
            {
                GRAM_Y = i;
                GRAM_X = j;
                B[i][j] = 0;
            }
        }
    }
 
    Q.push(pii(0,0));
    BFS();
 
    int GRAM = B[GRAM_Y][GRAM_X];
    int PRINCESS = B[N-1][M-1];
 
    if(GRAM)
    {
        if(PRINCESS)
            PRINCESS = min(PRINCESS, GRAM+(N-1-GRAM_Y) + (M-1-GRAM_X));
        else
            PRINCESS = GRAM + (N-1-GRAM_Y) + (M-1-GRAM_X);
    }
    
    if(PRINCESS == 0 || PRINCESS > T)
        cout << "Fail" << endl;
    else
        cout << PRINCESS << endl;
    
    return 0;
}

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

[C++] 14925 - 목장 건설하기  (0) 2020.01.17
[C++] 2981 - 검문  (0) 2020.01.16
[C++] 2780 - 비밀번호  (0) 2020.01.15
[Python3] 1793 - 타일링  (0) 2020.01.13
[C] 2003 - 수들의 합 2  (0) 2020.01.13
Comments