티스토리 뷰

Algorithm/BOJ

14890 경사로

henry1214 2018. 4. 9. 16:48

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



모든 행과 열의 인접한 경사들을 살펴보면서 경사의 차이가 1일 때, 앞이 더 큰 경우와 뒤가 더 큰 경우가 있다. 각각의 경우에 대하여 경사가 낮은쪽으로 길이가 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
#include <cstdio>
#include <cstring>
 
int n,l,map[100][100],ans;
 
void solve()
{
    for(int i=0;i<n;i++// 가로
    {
        bool F=true,visit[100];
        memset(visit,0,sizeof(visit));
        for(int j=0;j<n-1;j++)
        {
            if(map[i][j]==map[i][j+1]) continue;            
            int d=map[i][j]-map[i][j+1];
            if(d!=-1 && d!=1) { F=falsebreak; }
            if(d==-1// 오른쪽이 더 큼
            {
                bool f=true;
                for(int k=j;k>=j-l+1;k--)
                {
                    if(k<0 || map[i][j]!=map[i][k] || visit[k])
                    {
                        f=false;
                        break;
                    }
                }
                if(f) for(int k=j;k>=j-l+1;k--) visit[k]=true;
                else { F=falsebreak; }
            }
            else // 현재가 더 큼
            {
                bool f=true;
                for(int k=j+1;k<j+1+l;k++)
                {
                    if(k>=|| map[i][j+1]!=map[i][k] || visit[k])
                    {
                        f=false;
                        break;
                    }
                }
                if(f) for(int k=j+1;k<j+1+l;k++) visit[k]=true;
                else { F=falsebreak; }
            }
        }
        if(F) ans++;
    }
 
    for(int j=0;j<n;j++// 세로
    {
        bool F=true,visit[100];
        memset(visit,0,sizeof(visit));
        for(int i=0;i<n-1;i++)
        {
            if(map[i][j]==map[i+1][j]) continue;
            int d=map[i][j]-map[i+1][j];
            if(d!=-1 && d!=1) { F=falsebreak; }
            if(d==-1// 아래가 더 큼
            {
                bool f=true;
                for(int k=i;k>=i-l+1;k--)
                {
                    if(k<0 || map[i][j]!=map[k][j] || visit[k])
                    {
                        f=false;
                        break;
                    }
                }
                if(f) for(int k=i;k>=i-l+1;k--) visit[k]=true;
                else { F=falsebreak; }
            }
            else // 현재가 더 큼
            {
                bool f=true;
                for(int k=i+1;k<i+1+l;k++)
                {
                    if(k>=|| map[i+1][j]!=map[k][j] || visit[k])
                    {
                        f=false;
                        break;
                    }
                }
                if(f) for(int k=i+1;k<i+1+l;k++) visit[k]=true;
                else { F=falsebreak; }
            }
        }
        if(F) ans++;
    }
}
 
int main()
{
    scanf("%d %d",&n,&l);
    for(int i=0;i<n;i++for(int j=0;j<n;j++)
        scanf("%d",&map[i][j]);
    solve();
    printf("%d",ans);
    return 0;
}
cs


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

15686 치킨 배달  (0) 2018.04.16
14891 톱니바퀴  (0) 2018.04.09
14889 스타트와 링크  (0) 2018.04.09
14888 연산자 끼워넣기  (0) 2018.04.09
14503 로봇 청소기  (0) 2018.04.09
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday