가로방향으로 진행하는 함수와 세로방향으로 진행하는 함수 두개를 만들어 따로 탐색하였다.


설명은 주석으로 자세히 하였다.




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 <iostream>
#include <memory.h>
using namespace std;
 
int t, n, k;
int map[20][20];
bool check[20][20];
 
//가로방향
bool dfs(int x,int y) {
    if (y == n - 1return true;
    //높이 같은경우
    if (map[x][y] == map[x][y + 1]) return dfs(x, y + 1);
    //내리막
    else if (map[x][y] == map[x][y + 1+ 1) {
        //범위 벗어남
        if (y + k >= n) return false;
        for (int i = 1; i <= k; i++) {
            //경사로 설치
            check[x][y + i] = true;
            //높이 다르면
            if (map[x][y] != map[x][y + i] + 1)return false;
        }
        return dfs(x, y + k);
    }
    //오르막
    else if (map[x][y] == map[x][y + 1- 1) {
        //범위 벗어남
        if (y - k + 1 < 0return false;
        for (int i = 0; i < k; i++) {
            //이미 경사로 설치됨
            if (check[x][y - i]) return false;
            //높이 다름
            if (map[x][y] != map[x][y - i]) return false;
            check[x][y - i] = true;
        }
        return dfs(x, y + 1);
    }
    return false;
}
 
//세로방향
bool dfs2(int x, int y) {
    if (x == n - 1return true;
 
    //높이 같은경우
    if (map[x][y] == map[x + 1][y]) return dfs2(x + 1, y);
    //내리막
    else if (map[x][y] == map[x+1][y] + 1) {
        //범위 벗어남
        if (x + k >= n) return false;
        for (int i = 1; i <= k; i++) {
            //경사로 설치
            check[x + i][y] = true;
            //높이 다르면
            if (map[x][y] != map[x+i][y] + 1)return false;
        }
        return dfs2(x + k, y);
    }
    //오르막
    else if (map[x][y] == map[x+1][y] - 1) {
        //범위 벗어남
        if (x - k + 1 < 0return false;
        for (int i = 0; i < k; i++) {
            //이미 경사로 설치됨
            if (check[x - i][y]) return false;
            //높이 다름
            if (map[x][y] != map[x-i][y]) return false;
            check[x - i][y] = true;
        }
        return dfs2(x + 1, y);
    }
    return false;
}
 
 
int main() {
    ios_base::sync_with_stdio(false); cin.tie(0);
 
 
    cin >> t;
 
    for (int tc = 1; tc <= t; tc++) {
        cin >> n >> k;
 
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                cin >> map[i][j];
            }
        }
 
        int res = 0;
        for (int i = 0; i < n; i++)if (dfs(i, 0))res++;
        memset(check, 0sizeof(check));
        for (int i = 0; i < n; i++)if (dfs2(0, i))res++;
        memset(check, 0sizeof(check));
        cout << "#" << tc << " " << res << endl;
    }
}
cs


'SWEA::문제풀이' 카테고리의 다른 글

2383 점심 식사시간  (4) 2018.04.11
1861 정사각형 방  (0) 2018.04.10
3304 최장 공통 부분 수열  (0) 2018.04.08
2382 미생물 격리  (2) 2018.03.29
4013 특이한 자석  (0) 2018.03.26

+ Recent posts