package ssafy;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Solution {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine()); // 테스트 케이스
ArrayList<Integer> arr = new ArrayList<>(); // 정답을 저장할 list
// 테스트케이스
for(int i=0; i<T; i++) {
int answer = 0;
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int count = 0;
int N = Integer.parseInt(st.nextToken()); // 단어 퍼즐의 가로, 세로 길이
int K = Integer.parseInt(st.nextToken()); // 단어의 길이
// 퍼즐
int[][] puzzle = new int[N][N];
// 퍼즐에 입력값 초기화
for(int j=0; j<N; j++) {
st = new StringTokenizer(br.readLine()," ");
for(int k=0; k<N; k++) {
puzzle[j][k] = Integer.parseInt(st.nextToken());
}
}
// 가로에서의 조건 충족
for(int j=0; j<N; j++) {
for(int k=0; k<N; k++) {
// 1일때 카운트증가
if(puzzle[j][k] == 1) {
count++;
} else {
count = 0;
}
// 카운트가 K(단어의 길이)를 충족할때
if(count == K) {
// 마지막 칸이면 answer 증가시키고 카운트 0으로 초기화
if(k == N-1) {
answer++;
count = 0;
// 마지막 칸이 아닐 때 다음칸이 0이면 answer 증가시키고 카운트 0으로 초기화
} else {
if(puzzle[j][k+1] == 0) {
answer++;
count = 0;
}
}
}
}
count = 0;
}
// 세로에서의 조건 충족
for(int j=0; j<N; j++) {
for(int k=0; k<N; k++) {
if(puzzle[k][j] == 1) {
count++;
} else {
count = 0;
}
if(count == K) {
if(k == N-1) {
answer++;
count = 0;
} else {
if(puzzle[k+1][j] == 0) {
answer++;
count = 0;
}
}
}
}
count = 0;
}
arr.add(answer);
}
for(int i=1; i<=T; i++) {
System.out.println("#" + i + " " + arr.get(i-1));
}
}
}