#include #include #include #include #include using namespace std; const int maxn=400; const int inf=0x7f7f7f7f; int level[maxn],iter[maxn]; char mp[20][20]; struct edge{ int to,cap,rev; }; vectored[maxn]; void init(int x) { for(int i=0;i<=2*x*x;i++)ed[i].clear(); } void add(int u,int v,int w) { ed[u].push_back((edge){v,w,(int)ed[v].size()}); ed[v].push_back((edge){u,0,(int)ed[u].size()-1}); } void bfs(int s) { memset(level,-1,sizeof(level)); queueqx; qx.push(s); while(!qx.empty()) { int x=qx.front(); qx.pop(); for(auto y:ed[x]) { if(y.cap&&level[y.to]<0) { level[y.to]=level[x]+1; qx.push(y.to); } } } return; } int dfs(int s,int t,int f) { if(s==t)return f; for(int&i=iter[s];ilevel[s]) { int d=dfs(y.to,t,min(f,y.cap)); if(d) { y.cap-=d; ed[y.to][y.rev].cap+=d; return d; } } } return 0; } int dinic(int s,int t) { int flow=0; while(1) { bfs(s); if(level[t]<0)return flow; memset(iter,0,sizeof(iter)); int f; while(f=dfs(s,t,inf))flow+=f; } } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t; cin>>t; while(t--) { int n; cin>>n; int ss=1,tt=2*n*n; init(n); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>mp[i][j]; } } if(mp[1][1]=='#'||mp[n][n]=='#') { cout<<0<<"\n"; continue; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(mp[i][j]=='#')continue; else { if(i+1<=n&&mp[i+1][j]=='.')add((i-1)*n+j,n*n+i*n+j,1); if(j+1<=n&&mp[i][j+1]=='.')add((i-1)*n+j,n*n+(i-1)*n+j+1,1); } } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { add(n*n+(i-1)*n+j,(i-1)*n+j,1); } } cout<