#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
#define DEBUG 0
#define MAXMAP 14
usingnamespacestd;vector<pair<int,int>>procs;intmap[MAXMAP][MAXMAP];intnsize=0;intdir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};// 동, 서, 남, 북intmax_connection=0;voidclear_map(){procs.clear();max_connection=0;for(inti=0;i<MAXMAP;i++)for(intj=0;j<MAXMAP;j++)map[i][j]=-1;}voidget_input(){clear_map();cin>>nsize;for(inti=1;i<=nsize;i++){for(intj=1;j<=nsize;j++){cin>>map[i][j];if(map[i][j]==1){// if input is processorif(i>1&&i<nsize&&j>1&&j<nsize)procs.push_back(pair<int,int>(i,j));}}}procs.push_back(make_pair(-1,-1));}intget_distance(intdirection,pair<int,int>loc,intcopy_map[MAXMAP][MAXMAP]){// return distance from location to wall, if not valid, return -1introw=loc.first;intcol=loc.second;intdistance=0;for(inti=1;i<=nsize;i++){intnewrow=row+dir[direction][0]*i;intnewcol=col+dir[direction][1]*i;if(copy_map[newrow][newcol]==-1)break;if(copy_map[newrow][newcol]==1||copy_map[newrow][newcol]==2){distance=0;break;}distance+=1;}returndistance;}pair<int,int>dfs(intdepth,intconn,pair<int,int>proc,intcmap[MAXMAP][MAXMAP]){if(depth>=procs.size()-1)returnmake_pair(conn,0);if(conn>max_connection)max_connection+=1;vector<pair<int,int>>next;// vector of pair<distance, direction>for(inti=0;i<4;i++){intdistance=get_distance(i,proc,cmap);if(distance!=0){next.push_back(make_pair(distance,i));}}sort(next.begin(),next.end());// search shortest distance firstnext.push_back(make_pair(0,4));// case of no connectionvector<pair<int,int>>candidate;for(inti=0;i<next.size();i++){intdistance=next.at(i).first;intdirection=next.at(i).second;intcopy_map[MAXMAP][MAXMAP];// save before statusfor(intj=0;j<MAXMAP;j++)for(intk=0;k<MAXMAP;k++)copy_map[j][k]=cmap[j][k];for(intj=0;j<distance;j++){intnewrow=proc.first+dir[direction][0]*(j+1);intnewcol=proc.second+dir[direction][1]*(j+1);copy_map[newrow][newcol]=2;}intconnection=conn;if(distance!=0)connection+=1;// first, compare connection, if bigger than other node, select it and update distane to ret_valpair<int,int>res=dfs(depth+1,connection,procs.at(depth+1),copy_map);res.second+=distance;candidate.push_back(res);if(distance==1){// just connect to wall and do not check others break;}}pair<int,int>ret;sort(candidate.begin(),candidate.end());ret=candidate.back();for(inti=0;i<candidate.size();i++){if(candidate.at(i).first==ret.first){ret=candidate.at(i);break;}}returnret;}intmain(){intntest=0;intsol[51]={0,};cin>>ntest;for(inti=0;i<ntest;i++){get_input();sol[i]=dfs(0,1,procs.at(0),map).second;}for(inti=0;i<ntest;i++)cout<<"#"<<i+1<<" "<<sol[i]<<endl;return0;}