#include <iostream>
#include <cstring>
#include <cmath>
usingnamespacestd;#define MAXMAP 22
intN,X;floatmap[MAXMAP][MAXMAP];voidget_input(){memset(map,0,sizeof(map));cin>>N>>X;for(inti=1;i<=N;i++)for(intj=1;j<=N;j++)cin>>map[i][j];}intbuild(floatarr[MAXMAP]){for(inti=1;i<N;i++){if(abs(arr[i]-arr[i+1])>=2)return0;if(arr[i]<arr[i+1]&&arr[i]-int(arr[i])>0)// 현재가 내리막길이고 다음에 높은게 나올때return0;if(arr[i]-arr[i+1]<-0.6){// arr[i+1]이 더 클때for(intj=0;j<X;j++)// X 길이만큼의 다리를 왼쪽으로 놓을 수 있는지 확인if(arr[i]!=arr[i-j])return0;for(intj=0;j<X;j++)// X 길이만큼의 다리를 왼쪽으로 놓음arr[i-j]+=0.5;}elseif(arr[i]-arr[i+1]>0.6){// arr[i+1]이 더 작을 때 for(intj=0;j<X;j++)// X 길이만큼의 다리를 오른쪽으로 놓을 수 있는지 확인if(arr[i+1]!=arr[i+1+j])return0;for(intj=0;j<X;j++)// X 길이만큼의 다리를 놓음arr[i+1+j]+=0.5;}}return1;}intsolve(){intcount=0;floattemp[MAXMAP];for(inti=1;i<=N;i++){memcpy(temp,map[i],sizeof(temp));if(build(temp)==1)count++;}memset(temp,0,sizeof(temp));for(inti=1;i<=N;i++){for(intj=0;j<MAXMAP;j++)temp[j]=map[j][i];if(build(temp)==1)count++;}returncount;}intmain(){intsol[50]={0,};intntest;cin>>ntest;for(inti=0;i<ntest;i++){get_input();sol[i]=solve();}for(inti=0;i<ntest;i++)cout<<"#"<<i+1<<" "<<sol[i]<<endl;}