경사로

시간 제한2초메모리 제한512 MB

요약
모든 칸의 높이가 같거나 높이 차가 1인 단차를 길이 L의 경사로로 메울 수 있는 행과 열의 수를 센다.
난이도

보통10점 중 5점

유형
구현, 시뮬레이션, 배열
정답자
아직 제출이 없습니다

문제

크기가 N×NN \times N인 지도가 있다. 지도의 각 칸에는 그 칸의 높이가 적혀 있다.

이 지도에서 지나갈 수 있는 길이 몇 개인지 세려고 한다. 길은 한 행 전체 또는 한 열 전체를 뜻하고, 한쪽 끝에서 반대쪽 끝까지 지나가는 것이다. 따라서 길은 모두 2N2N개이다.

N=6N = 6인 지도를 예로 살펴보자.

이 지도에 있는 길 2N2N개는 아래와 같다.

길에 속한 칸의 높이가 모두 같으면 그 길은 지나갈 수 있다. 높이가 다르면 경사로를 놓아서 지나갈 수 있는 길을 만들 수 있다. 경사로의 높이는 항상 1이고 길이는 LL이다. 경사로의 개수는 충분히 많아서 모자랄 일이 없다. 경사로는 낮은 칸과 높은 칸을 이어 주며, 다음 조건을 지켜야 한다.

  • 경사로는 낮은 쪽에 놓고, 연속한 LL개의 칸에 경사로 바닥이 모두 닿아야 한다.
  • 낮은 칸과 높은 칸의 높이 차이는 1이어야 한다.
  • 경사로를 놓을 LL개의 칸은 연속해야 하고, 높이가 모두 같아야 한다.

다음과 같은 경우에는 경사로를 놓을 수 없다.

  • 경사로가 이미 놓인 칸에 경사로를 또 놓는 경우
  • 낮은 칸과 높은 칸의 높이 차이가 1이 아닌 경우
  • 낮은 쪽 칸의 높이가 서로 다르거나, LL개가 연속하지 않는 경우
  • 경사로가 지도 밖으로 나가는 경우

L=2L = 2일 때 경사로를 놓을 수 있는 경우를 그림으로 나타내면 아래와 같다.

경사로를 놓을 수 없는 경우는 아래와 같다.

위 그림에서 가장 왼쪽부터 차례로 1번, 2번, 3번, 4번이라고 하면, 1번은 높이 차이가 1이 아니라서, 2번은 경사로 바닥을 칸에 닿게 놓지 않아서, 3번은 경사로를 겹쳐 놓아서, 4번은 경사로를 기울여 놓아서 불가능하다.

맨 위에 나온 N=6N = 6 지도에서 L=2L = 2일 때, 지나갈 수 있는 길은 파란색으로, 지나갈 수 없는 길은 빨간색으로 표시하면 아래와 같다.

지도가 주어졌을 때, 지나갈 수 있는 길의 개수를 구하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에 지나갈 수 있는 길의 개수를 출력한다.

예제4

  1. 예제 1

    입력
    6 2
    3 3 3 3 3 3
    2 3 3 3 3 3
    2 2 2 3 2 3
    1 1 1 2 2 2
    1 1 1 3 3 1
    1 1 2 3 3 2
    
    예상 출력
    3
    
  2. 예제 2

    입력
    6 2
    3 2 1 1 2 3
    3 2 2 1 2 3
    3 2 2 2 3 3
    3 3 3 3 3 3
    3 3 3 3 2 2
    3 3 3 3 2 2
    
    예상 출력
    7
    
  3. 예제 3

    입력
    6 3
    3 2 1 1 2 3
    3 2 2 1 2 3
    3 2 2 2 3 3
    3 3 3 3 3 3
    3 3 3 3 2 2
    3 3 3 3 2 2
    
    예상 출력
    3
    
  4. 예제 4

    입력
    6 1
    3 2 1 1 2 3
    3 2 2 1 2 3
    3 2 2 2 3 3
    3 3 3 3 3 3
    3 3 3 3 2 2
    3 3 3 3 2 2
    
    예상 출력
    11