# 4014. 활주로 건설
# 활주로 건설 가능한 경우의 수를 파악하는 함수
def build(G, t):
# 경우의 수
cnt = 0
# 가로
for i in range(N):
road = G[i]
temp = [0] * N
temp[0] = 1
tf = True
for i in range(N-1):
cur = road[i]
nxt = road[i+1]
# 이웃한 것이 같을 때
if cur == nxt:
temp[i+1] = temp[i] + 1
# 오른쪽 계단이 더 높을 때
elif cur < nxt:
if cur + 1 < nxt:
tf = False
break
# 오르막 경사로를 만들 수 있음
if temp[i] >= X:
temp[i+1] = 1
else:
tf = False
break
# 오른쪽 계단이 더 낮을 때
elif cur > nxt:
if cur -1 > nxt:
tf = False
break
# 내리막 경사로 만들 수 없음
if temp[i] < 0:
tf = False
break
# 내리막 경사로 만들 수 있음
else:
temp[i+1] = 1-X
if tf:
if temp[-1] >= 0:
cnt += 1
# 90도 시계방향 회전
G_90 = [[0] * N for _ in range(N)]
for i in range(N):
for j in range(N):
G_90[j][N-1-i] = G[i][j]
# 세로
for i in range(N):
road = G_90[i]
temp = [0] * N
temp[0] = 1
tf = True
for i in range(N-1):
cur = road[i]
nxt = road[i+1]
# 이웃한 것이 같을 때
if cur == nxt:
temp[i+1] = temp[i] + 1
# 오른쪽 계단이 더 높을 때
elif cur < nxt:
if cur + 1 < nxt:
tf = False
break
# 오르막 경사로를 만들 수 있음
if temp[i] >= X:
temp[i+1] = 1
else:
tf = False
break
# 오른쪽 계단이 더 낮을 때
elif cur > nxt:
if cur -1 > nxt:
tf = False
break
# 내리막 경사로 만들 수 없음
if temp[i] < 0:
tf = False
break
# 내리막 경사로 만들 수 있음
else:
temp[i+1] = 1-X
if tf:
if temp[-1] >= 0:
cnt += 1
# 답안 출력
print("#{} {}".format(t, cnt))
# 총 테스트 케이스의 개수 T
T = int(input())
# T개의 테스트 케이스
for t in range(1, T+1):
# N, X가 주어진다.
N, X = map(int, input().split())
# 지형
tr = []
# N × N 크기의 지형 정보가 주어진다.
for _ in range(N):
tr.append(list(map(int, input().split())))
# 함수 실행
build(tr, t)