// Problem: CF837D Round Subset // Contest: Luogu // URL: https://www.luogu.com.cn/problem/CF837D // Memory Limit: 250 MB // Time Limit: 2000 ms // Author:Cutele // // Powered by CP Editor (https://cpeditor.org) #pragma GCC optimize(1) #pragma GCC optimize(2) #pragma GCC optimize(3,"Ofast","inline") #include using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pairPLL; typedef pairPII; typedef pairPDD; #define I_int ll inline ll read(){ll x = 0, f = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-')f = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0';ch = getchar();}return x * f;} inline void write(ll x){if (x < 0) x = ~x + 1, putchar('-');if (x > 9) write(x / 10);putchar(x % 10 + '0');} #define read read() #define closeSync ios::sync_with_stdio(0);cin.tie(0);cout.tie(0) #define multiCase int T;cin>>T;for(int t=1;t<=T;t++) #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i<(b);i++) #define per(i,a,b) for(int i=(a);i>=(b);i--) #define perr(i,a,b) for(int i=(a);i>(b);i--) ll ksm(ll a, ll b,ll mod){ll res = 1;while(b){if(b&1)res=res*a%mod;a=a*a%mod;b>>=1;}return res;} const int maxn=310+7;///总点个数,随题意改 const int MAX=1<<26;///最大值,随题意改 ///链式前向星存储边 ///表示u->v 边权为c(容量) 下一条边 struct Edge{ ll u,v,c,ne; }; ///求最大流 struct Dinic{ int n,m;///点数,边数 int edn;///建图时所用边数 int p[maxn];///链式前向星存图的父节点 int d[maxn];///分层建图时表示的层数 int sp,tp;///原点 汇点 Edge edge[maxn*6];///存储边 ///初始化 void init(int sp,int tp){ ///this->sp=sp;//可省去 /// this->tp=tp; edn=0;///清空建图时计边的计数器 /// memset(p,-1,sizeof p); memset(p,-1,sizeof(int)*(n+2));///小优化 仅初始化使用的空间 } void addedge(int u,int v,int c){///建图加边 edge[edn]={u,v,c,p[u]};p[u]=edn++;///正向一定要加的 edge[edn]={v,u,0,p[v]};p[v]=edn++;///无向图改成c 反悔边 } ///分层建图并且寻找增广路的过程 int bfs(){ queueq; while(!q.empty()) q.pop();///清空队列 memset(d,-1,sizeof d);///初始化距离数组 d[sp]=0;q.push(sp);///进行分层建图 while(!q.empty()){ int cur=q.front();q.pop(); for(int i=p[cur];~i;i=edge[i].ne){ int u=edge[i].v; if(d[u]==-1&&edge[i].c>0){///容量>0才会有贡献 d[u]=d[cur]+1; q.push(u); } } } return d[tp]!=-1;///是否存在增广路 } ll dfs(ll a,ll b){ ll r=0; if(a==tp) return b;///到达汇点 for(int i=p[a];~i&&r0&&d[u]==d[a]+1){ ///只拓展下一层 并且容量>0才会有贡献 int x=min(edge[i].c,b-r);///可以增加的流量 x=dfs(u,x); r+=x;///统计流量 ///更新边权:找到反向边 ///奇数异或1相当于-1,偶数异或1相当于+1 edge[i].c-=x;///回溯时更新 edge[i^1].c+=x;///成对变换 } ///if(!r) break; } if(!r) d[a]-=2;///uncertain return r; } ll Maxflow(){ ll total=0,t; while(bfs()){ while(t=dfs(sp,MAX)) total+=t;///增广找到流量 } return total; } }dinic; char mp[15][15]; ll dp[15][15]; ll dfs(int sx,int sy,int ex,int ey){ memset(dp,0,sizeof dp); for(int i=sx;i<=ex;i++) for(int j=sy;j<=ey;j++) if(mp[i][j]=='.'){ if(i==sx&&j==sy) dp[sx][sy]=1; else dp[i][j]=dp[i-1][j]+dp[i][j-1]; } return dp[ex][ey]; } int main(){ int _=read; while(_--){ int n=read; rep(i,1,n) cin>>mp[i]+1; if(mp[1][1]=='#'||mp[n][n]=='#'){ puts("0");continue; } ll e1=dfs(2,1,n,n-1),e2=dfs(2,1,n-1,n); ll e3=dfs(1,2,n,n-1),e4=dfs(1,2,n-1,n); if(e1*e4-e2*e3>0) puts("2"); else{ if(dfs(1,1,n,n)) puts("1"); else puts("0"); } } return 0; }