알고리즘 문제/BOJ
14890번 경사로
parkit
2019. 8. 26. 19:38
728x90
반응형
https://www.acmicpc.net/problem/14890
오랜만에 다시 풀어보았는데 오래 걸렸다.
변명하자면, 사실 방문 처리를 안 하고 풀려고 했었다.
그런데 계속 안 풀리길래 그냥 방문 처리 배열을 사용하였다.
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 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | #include <bits/stdc++.h> using namespace std; int N, L, Map[101][101]; bool visit[101][101][2]; int check() { int ret = 0; for (int r = 0; r < N; r++) { int bf = 0; bool make = true; for (int c = 0; c < N; c++) { if (!c) { bf = Map[r][c]; continue; } if (Map[r][c] - bf > 0) // 증가 { if (Map[r][c] - bf > 1) { make = false; break; } for (int i = c - 1; i > c - L - 1; i--) { if (i < 0 || visit[r][i][0] || Map[r][c - 1] != Map[r][i]) { make = false; break; } visit[r][i][0] = true; } } else if (Map[r][c] - bf < 0) // 감소 { if (Map[r][c] - bf < -1) { make = false; break; } for (int i = c; i < c + L; i++) { if ( i > N || visit[r][i][0] || Map[r][c] != Map[r][i]) { make = false; break; } visit[r][i][0] = true; } c += (L - 1); } if (!make) break; bf = Map[r][c]; } if (make) ++ret; } for (int c = 0; c < N; c++) { int bf = 0; bool make = true; for (int r = 0; r < N; r++) { if (!r) { bf = Map[r][c]; continue; } if (Map[r][c] - bf > 0) // 증가 { if (Map[r][c] - bf > 1) { make = false; break; } for (int i = r - 1; i > r - L - 1; i--) { if (i < 0 || visit[i][c][1] || Map[r - 1][c] != Map[i][c]) { make = false; break; } visit[i][c][1] = true; } } else if (Map[r][c] - bf < 0) // 감소 { if (Map[r][c] - bf < -1) { make = false; break; } for (int i = r; i < r + L; i++) { if (i > N || visit[i][c][1] || Map[r][c] != Map[i][c]) { make = false; break; } visit[i][c][1] = true; } r += (L - 1); } if (!make) break; bf = Map[r][c]; } if (make) ++ret; } return ret; } int main(void) { scanf("%d %d", &N, &L); for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) scanf("%d", &Map[i][j]); printf("%d\n", check()); return 0; } | cs |
728x90
반응형