Game Develop

[Algorithm] Baekjoon 14890번 : 경사로 본문

Algorithm/Baekjoon

[Algorithm] Baekjoon 14890번 : 경사로

MaxLevel 2023. 9. 29. 01:52

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

 

14890번: 경사로

첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.

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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
int n, l;
int arr[100][100= { 0 };
bool isInstalled[100][100= { false };
 
bool checkInRange(int y, int x)
{
    if (y < 0 || y >= n || x < 0 || x >= n) return false;
    return true;
}
 
int move(int y, int x, bool isRow)
{
    memset(isInstalled, falsesizeof(isInstalled));
    int offsetY = isRow ? 0 : 1;
    int offsetX = isRow ? 1 : 0;
    int curY = y;
    int curX = x;
    int targetY = isRow ? curY : n - 1;
    int targetX = !isRow ? curX : n - 1;
 
    while (!(curY == targetY && curX == targetX))
    {
        int nextY = curY + offsetY;
        int nextX = curX + offsetX;
        int heightGap = arr[curY][curX] - arr[nextY][nextX];
 
        if (heightGap == 0)
        {
            curY = nextY;
            curX = nextX;
        }
        else if (heightGap == 1// 한칸 낮으면
        {
            int count = 1;
            int targetHeight = arr[nextY][nextX];
 
            while (count != l)
            {
                nextY += offsetY;
                nextX += offsetX;
                if (!checkInRange(nextY, nextX)) break;
                if (arr[nextY][nextX] != targetHeight) break;
                ++count;
            }
 
            if (count < l) return 0;
 
            curY = nextY;
            curX = nextX;
            isInstalled[curY][curX] = true;
        }
        else if (heightGap == -1// 한칸 높으면
        {
            int count = 1;
            int prevY = curY;
            int prevX = curX;
            int targetHeight = arr[curY][curX];
            if (isInstalled[prevY][prevX]) return 0;
 
            while (count != l)
            {
                prevY -= offsetY;
                prevX -= offsetX;
 
                if (isInstalled[prevY][prevX]) return 0;
                if (!checkInRange(prevY, prevX)) break;
                if (arr[prevY][prevX] != targetHeight) break;
                ++count;
            }
 
            if (count < l) return 0;
 
            curY = nextY;
            curX = nextX;
        }
        else return 0;
    }
 
    return 1;
}
 
int main(void)
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    cin >> n >> l;
 
    int result = 0;
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < n; ++j)
        {
            cin >> arr[i][j];
        }
    }
 
    for (int i = 0; i < n; ++i)
    {
        result += move(i, 0true+ move(0, i, false);
    } 
 
    cout << result;
}
cs

복잡한 논리를 요구하지 않는 구현문제이다.

현재칸과 앞의 칸의 높이차에 따라 어떻게 동작할지 잘 구현해주면 된다.