https://www.acmicpc.net/problem/14890
#14890 경사로
import sys
N, L = map(int,sys.stdin.readline().split())
rlist = [list(map(int,sys.stdin.readline().split())) for _ in range(N)] # 가로
clist = [[0]*N for _ in range(N)] # 세로
# 가로로 탐색하는 경우와 세로로 탐색하는 경우의 로직이 같음
# 하나의 함수로 한번에 활용하기 위해 열과 행을 바꿔 저장한 배열도 생성
for i in range(N):
for j in range(N):
clist[j][i]=rlist[i][j]
# 활주로가 가능한지 확인
def isAble(mlist):
m=1 # L만큼의 길이가 있는지 확인
i=1
while i<N:
if abs(mlist[i]-mlist[i-1])>1: # 높이가 2 이상 차이나면 안됨
return False
elif mlist[i-1]==mlist[i]: # 직전과 높이가 같다면
m+=1 # 칸 개수 count
elif mlist[i-1]+1==mlist[i]: # 직전보다 높이가 1 높다면
if m>=L: # 현재보다 1 낮은 칸의 개수가 L이상 이어졌는지 확인
m=1 # 칸 개수 초기화
else:
return False
elif mlist[i-1]==mlist[i]+1: # 직전보다 높이가 1 낮다면
m=1 # 현재 칸부터 개수를 셈
k=mlist[i]
for j in range(i+1,N):
if m==L: # L만큼 왔으면 멈춤
break
if mlist[j]==k: # 같은 높이인지 확인
m+=1
i+=1
else:
break
if m >= L:
m = 0
else:
return False;
i+=1
return True
# 활주로의 개수
def check():
res = 0
for i in range(N):
if isAble(rlist[i]): # 가로
res+=1
if isAble(clist[i]): # 세로
res+=1
return res
print(check())