개발/알고리즘

[greedy method] 스노보드/snowboard

재근이 2015. 2. 12. 01:34
반응형
프로그램 명: snowboard
제한시간: 1 초

마이클은 스노우보드를 매우 즐기는 녀석이다. 그런데 , 스노우 보드 탈 때 한가지 문제점은 내려갈때는 신나지만 올라갈때는 다시 걸어서 올라가거나 리프트를 타야하는 점이다. 마이클은 다시 올라가는 것을 되도록이면 피하고 싶어한다. 우리가 마이클을 도와주도록 하자.

다음은 입력의 한 예이다.

1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

각각의 숫자는 산의 각 지점의 높이다. 스노우보드 움직일 때는 항상 높은 지점에서 낮은 지점으로만 움직여야 한다. 내려오는 코스는 산의 모든 지점을 포함하지 않을 수 있다. 위의 데이터에서 최적해는 25-24-..-2-1 이다.

입력 방법

첫째 줄에는 코스의 세로길이 R 와 가로길이 C 가 주어진다.(단, R 과 C 는 100 이하의 양의 정수). 각 지점의 높이는 100 을 넘지않은 정수로 주어진다.

출력 방법

주어진 데이터에서 가장 긴 코스의 길이를 출력한다.

입출력의 예

입력

10 5
56 14 51 58 88
26 94 24 39 41
24 16 8 51 51
76 72 77 43 10
38 50 59 84 81
5 23 37 71 77
96 10 93 53 82
94 15 96 69 9
74 0 62 38 96
37 54 55 82 38

출력

7

*참고*


출처: http://acm.uva.es/p/v102/10285.html

 

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
#include <stdio.h>
 
#define MAX 105
 
int R, C;
int Map[MAX][MAX];
int Visit[MAX][MAX];
 
int MaxCount=0;
 
void input()
{
    int i, j;
    scanf("%d", &R);
    scanf("%d", &C);
    for(i=1; i<=R; i++)
    {
        for(j=1; j<=C; j++)
        {
            scanf("%d", &Map[i][j]);        
            Map[i][j]++;
        }
    }
}
 
void dfs(int x, int y, int depth)
{
    int i;
    int dir[4][2] = {{1,0}, {0,1}, {-1,0}, {0,-1}};
 
    if(depth > MaxCount)
        MaxCount = depth;
 
    for(i=0; i<4; i++)
    {
        if(Visit[y+dir[i][1]][x+dir[i][0]] == 0)
        {
            if(Map[y][x] > Map[y+dir[i][1]][x+dir[i][0]] 
                && Map[y+dir[i][1]][x+dir[i][0]] > 0)
            {
                Visit[y+dir[i][1]][x+dir[i][0]]=1;
                dfs(x+dir[i][0], y+dir[i][1], depth+1);
                Visit[y+dir[i][1]][x+dir[i][0]]=0;
            }
        }
    }
}
 
void process()
{
    int i, j;
 
    for(i=1; i<=R; i++)
    {
        for(j=1; j<=C; j++)
        {
            dfs(j, i, 0);
        }
    }
}
 
int main(void)
{
    input();
    process();
    printf("%d\n", MaxCount+1);
 
    return 0;
}
cs

 

반응형

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

[bfs] 삼성이의 재난 예측  (0) 2015.02.12
[dfs] 단지 번호 붙이기 ->bfs로 풀기  (0) 2015.02.12
[bfs] dam  (0) 2015.02.06
[backtracking] eating_puzzle  (0) 2015.01.23
[재귀] upstair  (0) 2015.01.23