BOJ 14890: 경사로

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

  • 2월동안 187문제 풀기(지난달 누적 87개) (17/187)
  • 경사로를 놓는 조건이 생각보다 까다로운 편.
  • 실수하지 않고 생각한 것을 한번에 딱 구현하는 연습을 해야함.
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
#include <bits/stdc++.h>
using namespace std;

int N, L, arr[101][101], ans;

int bound(int n) {
  return n >= 0 && n < N;
}

int go(int x, int y, int dx, int dy) {
  int prev = -1, accu = 0, debt = 0;
  while(bound(x) && bound(y)) {
    int cur = arr[x][y];
    x += dx, y += dy;
    if(prev == -1) prev = cur, accu++;
    else if (prev == cur && debt) debt--;
    else if (prev == cur && !debt) accu++;
    else if (debt) return 0;
    else if (prev+1 == cur && accu >= L) prev = cur, accu = 1;
    else if (prev-1 == cur) prev = cur, accu = 0, debt = L-1;
    else return 0;
  }
  return debt ? 0 : 1;
}

int main() {
  cin >> N >> L;
  for(int i = 0; i < N; i++)
    for(int j = 0; j < N; j++)
      cin >> arr[i][j];
  for(int i = 0; i < N; i++) {
    ans += go(i,0,0,1);
    ans += go(0,i,1,0);
  }
  cout << ans;
}