[C언어] 14890. 경사로

SW 업무 관련/백준

[C언어] 14890. 경사로

WillBe_ 2018. 9. 25. 00:53

가로, 세로 각각에 대해 0~N-1 까지 탐색을 해준다!!


각각의 행렬에 대해 0부터 진행해 나간다.


진행해 나가면서 다음 칸의 높이와 현재 높이가 2이상 차이 나면 무시.

다음 칸의 높이가 낮으면, 다음 칸부터 L이 들어갈 수 있는지 따져준다.

다음 칸이 높이가 높으면, 현재 위치부터 지나온 길이에 L이 들어갈 수 있는지 따져준다.


이렇게 해주면 된다...중요한건!!!이미 경사로를 놓은 곳에 또 경사로를 놓으면 안 되니!! 배열 하나를 추가로 해서 체크해준다..완전 노가다...내가 보아도..정말 더럽고 비효율적인 코드....다른 사람의 풀이를 좀 봐야겠다!!


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
106
107
108
109
110
111
112
113
114
115
#include <stdio.h>
#include <string.h>
 
int map[100][100];
int N, L;
 
int main()
{
    scanf("%d %d",&N, &L);
 
    for (int a = 0; a < N; a++)
    {
        for (int b = 0; b < N; b++)
        {
            scanf("%d",&map[a][b]);
        }
    }
    int Flag, count=0;
    for (int a = 0; a < N; a++)
    {
        int arr[100= { 0, };
        for (int b = 0; b < N - 1; b++)//가로
        {
            if (map[a][b] - map[a][b + 1== 1)
            {
                Flag = 0;
                for (int c = 0; c < L; c++)
                {
                    if (arr[b + 1 + c] == 1 || b + 1 + c >= N||map[a][b + 1!= map[a][b + 1 + c])
                    {
                        Flag = 1;
                        break;
                    }
                    arr[b + 1 + c] = 1;
                }
                if (Flag)
                    break;
 
                b = b + L - 1;
            }
            else if (map[a][b] - map[a][b + 1== -1)
            {
                Flag = 0;
                for (int c = 0; c < L; c++)
                {
                    if (arr[b - c] == 1 || b - c < 0 ||map[a][b] != map[a][b - c])
                    { 
                        Flag = 1;
                        break;
                    }
                    arr[b - c] = 1;
                }
                if (Flag)
                    break;
            }
            else if (map[a][b] - map[a][b + 1> 1 || map[a][b] - map[a][b + 1< -1)
            {
                break;
            }
            
            if (b == N - 2)
            {
                count++;
            }
        }
        memset(arr, 0sizeof(arr));
        for (int b = 0; b < N - 1; b++)//세로
        {
            if (map[b][a] - map[b + 1][a] == 1)
            {
                Flag = 0;
                for (int c = 0; c < L; c++)
                {
                    if (arr[b + 1 + c] == 1|| b + 1 + c >= N||(map[b + 1][a] != map[b + 1 + c][a]))
                    {
                        Flag = 1;
                        break;
                    }
                    arr[b + 1 + c] = 1;
                }
                if (Flag)
                    break;
 
                b = b + L - 1;
            }
            else if (map[b][a] - map[b + 1][a] == -1)
            {
                Flag = 0;
                for (int c = 0; c < L; c++)
                {
                    if (arr[b - c] == 1 || b - c < 0 || (map[b][a] != map[b-c][a]))
                    {
                        Flag = 1;
                        break;
                    }
                    arr[b - c] = 1;
                }
                if (Flag)
                    break;
            }
            else if (map[b][a] - map[b + 1][a] > 1 || map[b][a] - map[b + 1][a] < -1)
            {
                break;
            }
            
            if (b == N - 2)
            {
                count++;
            }
        }
 
    }
    printf("%d\n",count);
    return 0;
}
cs


'SW 업무 관련 > 백준' 카테고리의 다른 글

[C언어] 15686. 치킨배달  (0) 2018.09.25
[C언어] 14889 스타트와 링크  (0) 2018.09.25
[C언어] 14891. 톱니바퀴  (0) 2018.09.24
[C언어] 25686 치킨 배달.  (0) 2018.09.24
[C언어] 6593 상범 빌딩  (0) 2018.09.24