시나브로

14890. 경사로 본문

알고리즘/백준

14890. 경사로

혬혬 2020. 10. 15. 20:02
728x90
#include <iostream>
using namespace std;
int map[110][110];

int main() {

    freopen("inp.inp", "r", stdin);
    freopen("out.out", "w", stdout);
    int n, l;
    cin >> n >> l;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> map[i][j];
        }
    }

    int answer = 0;


    for (int i = 0; i < n; i++) {
        int high = map[i][0];
        int sig = 1;

        int check[110] = { 0 };
        for (int j = 1; j < n; j++) {
            if (high == map[i][j])
                continue;
            else if (high + 1 == map[i][j]) {
                int s = 0;
                int box = map[i][j - 1];
                for (int k = j - 1; k >= j - l; k--) {
                    if (check[k] == 1) {
                        s = 1;
                        break;
                    }
                    if (k < 0 || box != map[i][k]) {
                        s = 1;
                        break;
                    }
                    check[k] = 1;
                }
                if (s) {
                    sig = 0;
                    break;
                }
                high = map[i][j];
            }
            else if (high == map[i][j] + 1) {
                int s = 0;
                int box = map[i][j];
                check[j] = 1;
                for (int k = j + 1; k <= j + l - 1; k++) {
                    if (check[k] == 1) {
                        s = 1;
                        break;
                    }
                    if (k >= n || box != map[i][k]) {
                        s = 1;
                        break;
                    }
                    check[k] = 1;
                }
                if (s) {
                    sig = 0;
                    break;
                }
                high = map[i][j];
            }
            else {
                sig = 0;
                break;
            }
        }
        if (sig)
            answer++;
    }

    for (int j = 0; j < n; j++) {
        int high = map[0][j];
        int sig = 1;
        int check[110] = { 0 };
        for (int i = 1; i < n; i++) {
            if (high == map[i][j])
                continue;
            else if (high + 1 == map[i][j]) {
                int s = 0;
                int box = map[i - 1][j];
                for (int k = i - 1; k >= i - l; k--) {

                    if (check[k] == 1) {
                        s = 1;
                        break;
                    }
                    if (k < 0 || box != map[k][j]) {
                        s = 1;
                        break;
                    }

                    check[k] = 1;
                }
                if (s) {
                    sig = 0;
                    break;
                }
                high = map[i][j];
            }
            else if (high == map[i][j] + 1) {
                int s = 0;
                int box = map[i][j];
                check[i] = 1;
                for (int k = i + 1; k <= i + l - 1; k++) {
                    if (check[k] == 1) {
                        s = 1;
                        break;
                    }
                    if (k >= n || box != map[k][j]) {
                        s = 1;
                        break;
                    }
                    check[k] = 1;
                }
                if (s) {
                    sig = 0;
                    break;
                }
                high = map[i][j];
            }
            else {
                sig = 0;
                break;
            }
        }
        if (sig)
            answer++;
    }
    cout << answer;
    return 0;
}

 

 

www.acmicpc.net/problem/14890

 

14890번: 경사로

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

www.acmicpc.net

 

 

728x90

'알고리즘 > 백준' 카테고리의 다른 글

19238. 스타트 택시  (0) 2020.10.17
15683. 감시  (0) 2020.10.15
3190. 뱀  (0) 2020.10.14
14891. 톱니바퀴  (0) 2020.10.14
14888. 연산자 끼워넣기  (0) 2020.08.27
Comments