How We Coding

[14890] 경사로

BOJ/SWEA2018. 3. 6. 18:11

[14890] 경사로 (http://boj.kr/14890)



right() 에서 L = 2 인경우


3 2 2 2 3 


3 2 2 1 1


x x 3 2 2 (마지막 위치)


2 2 3 


3 3 3


위 경우에 대해서 잘 처리해주면 된다. down() 도 마찬가지.



< 소스코드 >


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
#include <stdio.h>
 
int N, L, ans=0;
int g[101][101];
 
int down(int r, int c)
{
    int curH;
    if(r == N-1return 1;
 
    curH = g[r][c];
    if(r+< N && curH-g[r+L][c] == 1) {
        int flag = 1;
        for(int i=1; i<L; i++) {
            if(g[r+L][c] != g[r+i][c])
                flag = 0;
        }
        if(flag){
            if(r+== N-1return 1;
            if(g[r+L][c] == g[r+L+1][c])
                return down(r+L+1, c);
            if(g[r+L][c] == g[r+L+1][c]+1)
                return down(r+L, c);
        }
    }
    if(r+< N && g[r+L][c]-curH == 1) {
        int flag = 1;
        for(int i=1; i<L; i++) {
            if(curH != g[r+i][c])
                flag = 0;
        }
        if(flag) return down(r+L, c);
    }
    if(g[r+1][c] == curH) return down(r+1, c);
    return 0;
}
 
int right(int r, int c)
{
    int curH;
    if(c == N-1return 1;
 
    curH = g[r][c];
    if(c+< N && g[r][c+L]-curH == 1) {
        int flag = 1;
        for(int i=1; i<L; i++) {
            if(curH != g[r][c+i])
                flag = 0;
        }
        if(flag) return right(r, c+L);
    }
    if(c+< N && curH-g[r][c+L] == 1) {
        int flag = 1;
        for(int i=1; i<L; i++) {
            if(g[r][c+L] != g[r][c+i])
                flag = 0;
        }
        if(flag) {
            if(c+== N-1return 1;
            if(g[r][c+L] == g[r][c+L+1])
                return right(r, c+L+1);
            if(g[r][c+L] == g[r][c+L+1]+1)
                return right(r, c+L);
        }
    }
    if(g[r][c+1== curH) return right(r, c+1);
    return 0;
}
 
int main()
{
    scanf("%d%d"&N, &L);
 
    for(int i=0; i<N; i++)
        for(int j=0; j<N; j++)
            scanf("%d"&g[i][j]);
 
    for(int i=0; i<N; i++) {
        if(down(0, i)) ans++;
        if(right(i, 0)) ans++;
    }
    printf("%d\n", ans);
    return 0;
}
 
cs


>> 깔끔하게 경우의 수를 펜으로 써가며 확인했으면 금방 했을텐데, 괜히 머릿속으로 한다고 하다가, 시간만 많이 썼다...

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

[14889] 스타트와 링크  (0) 2018.02.28
[14888] 연산자 끼워넣기  (0) 2018.02.27