// Skyqwq #include #define pb push_back #define fi first #define se second #define mp make_pair using namespace std; typedef long long LL; template void chkMax(T &x, T y) { if (y > x) x = y; } template void chkMin(T &x, T y) { if (y < x) x = y; } template void inline read(T &x) { int f = 1; x = 0; char s = getchar(); while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); } while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar(); x *= f; } const int N = 205, M = N * 4, INF = 1e9; // 最大流 namespace MF{ int n, m, s, t, pre[N], cur[N], q[N]; LL res, maxflow, d[N]; int head[N], numE = 1; struct E{ int next, v, w; } e[M << 1]; void inline add(int u, int v, int w) { e[++numE] = (E) { head[u], v, w }; head[u] = numE; } void inline init(int v, int a, int b) { for (int i = 1; i <= n; i++) head[i] = 0; numE = 1; n = v, s = a, t = b; } bool inline bfs() { int hh = 0, tt = -1; for (int i = 1; i <= n; i++) d[i] = 0; q[++tt] = s, d[s] = 1, cur[s] = head[s]; while (hh <= tt) { int u = q[hh++]; for (int i = head[u]; i; i = e[i].next) { int v = e[i].v; if (!d[v] && e[i].w) { cur[v] = head[v]; q[++tt] = v, d[v] = d[u] + 1; if (v == t) return true; } } } return false; } LL inline dinic(int u, LL flow) { if (u == t) return flow; LL rest = flow; for (int i = cur[u]; i && rest; i = e[i].next) { cur[u] = i; int v = e[i].v; if (e[i].w && d[v] == d[u] + 1) { int k = dinic(v, min((LL)e[i].w, rest)); if (!k) d[v] = 0; rest -= k, e[i].w -= k, e[i ^ 1].w += k; } } return flow - rest; } void inline addE(int u, int v, int w) { add(u, v, w); add(v, u, 0); } LL inline work() { maxflow = 0; while (bfs()) { while (res = dinic(s, INF)) maxflow += res; } return maxflow; } } int n; char g[N][N]; int inline id(int x, int y, int o) { return o * n * n + (x - 1) * n + y; } int main() { int T; read(T); while (T--) { read(n); for (int i = 1; i <= n; i++) scanf("%s", g[i] + 1); if (g[1][1] == '#' || g[n][n] == '#') { puts("0"); continue; } int S = n * n + 1, T = n * n; MF::init(n * n * 2, S, T); for (int i = 2; i < n * n; i++) { MF::addE(i, i + n * n, 1); } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (g[i][j] == '#') continue; if (i < n && g[i + 1][j] == '.') { MF::addE(id(i, j, 1), id(i + 1, j, 0), 1); } if (j < n && g[i][j + 1] == '.') { MF::addE(id(i, j, 1), id(i, j + 1, 0), 1); } } } int ans = MF::work(); printf("%d\n", ans); } return 0; }