dr = [-1,0,1,0]
dc = [0,1,0,-1]
defdfs(r,c,path,isConst):global ans
if ans < path: #최장 등산로 갱신하기
ans = path
#사방 탐색 : 등산로 탐색for k inrange(4):
nr = r + dr[k]
nc = c + dc[k]
if nr <0or nr >= N or nc < 0or nc >= N : continue#영역벗어나면 스킵if visited[nr][nc] == 1 : continue#이동가능하면 이동if m[r][c] > m[nr][nc] :
visited[nr][nc] = 1
dfs(nr,nc,path+1,isConst)
visited[nr][nc] = 0#이동이 불가능하고 공사를 아직 안했으면 (1~K만큼 공사 가능 -> 모든경우)elif m[r][c] <= m[nr][nc] andnot isConst:
for i inrange(1,K+1):
m[nr][nc] -= i #공사하기
isConst = Trueif m[r][c] > m[nr][nc]:
visited[nr][nc] = 1
dfs(nr,nc,path+1,isConst)
visited[nr][nc] = 0#공사 취소하기 -> 다른 경우를 체크하기 위해
isConst = False
m[nr][nc] += i
T = int(input())
for tc inrange(1,T+1):
N,K = map(int,input().split())
m = [ list(map(int,input().split())) for _ inrange(N)]
#가장 높은 봉우리 찾기
maxH = 0for i inrange(N):
for j inrange(N):
if maxH < m[i][j] :
maxH = m[i][j]
ans = 0for i inrange(N):
for j inrange(N):
if m[i][j] == maxH:
visited = [[0]*N for _ inrange(N)] #방문배열
visited[i][j] = 1
dfs(i,j,1,False) #좌표,등산로길이,공사여부print("#{} {}".format(tc,ans))