가로방향으로 진행하는 함수와 세로방향으로 진행하는 함수 두개를 만들어 따로 탐색하였다.
설명은 주석으로 자세히 하였다.
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 - 1) return 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 < 0) return 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 - 1) return 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 < 0) return 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, 0, sizeof(check)); for (int i = 0; i < n; i++)if (dfs2(0, i))res++; memset(check, 0, sizeof(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 |