ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 등산 - 1486
    Algorithm/BOJ 2020. 2. 18. 19:41
    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
    //1486 - 등산
     
    #include <iostream>
    #include <vector>
    using namespace std;
     
    #define INF 200000000
     
    int N, M, T, D;
    vector<vector<int>> adj, arr;
    int xarr[4= {1-100};
    int yarr[4= {001-1};
     
    void init()
    {
        cin >> N >> M >> T >> D;
        arr = vector<vector<int>>(N, vector<int>(M));
        adj = vector<vector<int>>(N*M, vector<int>(N*M, INF));
        char c;
        for(int i = 0; i<N; ++i)
            for(int j = 0; j<M; ++j)
            {
                cin >> c;
                if(c > 90)
                    c -= 6;
                arr[i][j] = c - 'A';
            }
     
        for(int i = 0; i<N; ++i)
            for(int j = 0; j<M; ++j)
            {
                int here = i*M+j;
                for(int k = 0; k<4++k)
                    if(i+xarr[k] >= 0 && i+xarr[k] <&& j+yarr[k] >=0 && j+yarr[k] < M)
                    {
                        int u = arr[i][j];
                        int v = arr[i+xarr[k]][j+yarr[k]];
                        int there = M*(i+xarr[k]) + j+yarr[k];
                        if(u - v > T || v - u > T)
                            adj[here][there] = INF;
                        else if(u < v)
                            adj[here][there] = (v-u)*(v-u);
                        else
                            adj[here][there] = 1;
                    }
            }
     
        for(int k = 0; k<N*M; ++k)
            for(int i = 0; i<N*M; ++i)
                for(int j = 0; j<N*M; ++j)
                    adj[i][j] = min(adj[i][j], adj[i][k] + adj[k][j]);
    }
     
    int main()
    {
        ios_base::sync_with_stdio(0);
        cin.tie(0);
        init();
        int ans = arr[0][0];
        for(int i = 1; i<N*M; ++i)
            if(adj[0][i] + adj[i][0<= D)
                ans = max(ans, arr[i/M][i%M]);
        cout << ans << "\n";
    }
    cs

     

     

     

     

     

     

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

     

    1486번: 등산

    첫째 줄에 산의 세로크기 N과 가로크기 M 그리고, T와 D가 주어진다. N과 M은 25보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 지도가 주어진다. T는 52보다 작거나 같은 자연수이고, D는 1,000,000보다 작거나 같은 자연수이다.

    www.acmicpc.net

     

     

     

     

     

     

    등산

    플로이드 와샬 문제입니다.

    주어진 입력값을 인접행렬 그래프로 표현하면 됩니다!

     

     

     

     

     

     

    'Algorithm > BOJ' 카테고리의 다른 글

    발전소 - 1102  (0) 2020.02.23
    외판원 순회 - 2098  (0) 2020.02.19
    DFS와 BFS  (0) 2020.02.18
    거의 최단 경로 - 5719  (0) 2020.02.18
    특정한 최단 경로 - 1504  (0) 2020.02.18

    댓글

Designed by Tistory.