#include <bits/stdc++.h> using namespace std; static inline int read_bit() { char ch; while (cin >> ch) { if (ch == '0' || ch == '1') return ch - '0'; } return 0; // 不会到这里 } int main() { int T; cin >> T; while (T--) { int n; cin >> n; vector<vector<int>> A(n, vector<int>(n)); vector<vector<int>> B(n, vector<int>(n)); for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) A[i][j] = read_bit(); for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) B[i][j] = read_bit(); // D = A xor B vector<vector<int>> D(n, vector<int>(n)); for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) D[i][j] = A[i][j] ^ B[i][j]; // 可行性检查:D[i][j] == D[i][0] ^ D[0][j] ^ D[0][0] bool ok = true; for (int i = 0; i < n && ok; ++i) for (int j = 0; j < n; ++j) if ((D[i][0] ^ D[0][j] ^ D[0][0]) != D[i][j]) { ok = false; break; } if (!ok) { cout << -1 << '\n'; continue; } // 构造 r,c 并求最少操作 vector<int> r(n), c(n); for (int i = 0; i < n; ++i) r[i] = D[i][0]; for (int j = 0; j < n; ++j) c[j] = D[0][j] ^ D[0][0]; int sr = accumulate(r.begin(), r.end(), 0); int sc = accumulate(c.begin(), c.end(), 0); int ans = min(sr + sc, 2 * n - (sr + sc)); cout << ans << '\n'; } return 0; }