#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 22;
const int INF = 1e9;
int n;
int a[N][N]; // 初始矩阵
int x[N][N]; // 主动翻转标记
int main() {
cin >> n;
for (int i = 1; i <= n; ++i) {
string s;
cin >> s;
for (int j = 1; j <= n; ++j) {
a[i][j] = s[j - 1] - '0';
}
}
int ans = INF;
// 枚举第一行的所有状态,共 2^n 种
for (int mask = 0; mask < (1 << n); ++mask) {
memset(x, 0, sizeof x);
// 设置第一行的翻转情况
for (int j = 1; j <= n; ++j) {
x[1][j] = (mask >> (j - 1)) & 1;
}
// 递推计算第 2 ~ n 行的翻转情况
for (int i = 1; i < n; ++i) {
for (int j = 1; j <= n; ++j) {
// 根据第 i 行的方程解出 x[i+1][j]
x[i + 1][j] = a[i][j] ^ x[i][j] ^ x[i - 1][j] ^ x[i][j - 1] ^ x[i][j + 1];
}
}
// 检查最后一行是否满足全 0
bool ok = true;
for (int j = 1; j <= n; ++j) {
int val = a[n][j] ^ x[n][j] ^ x[n - 1][j] ^ x[n][j - 1] ^ x[n][j + 1];
if (val != 0) {
ok = false;
break;
}
}
if (ok) {
int sum = 0;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
sum += x[i][j];
ans = min(ans, sum);
}
}
if (ans == INF) cout << -1 << endl;
else cout << ans << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGUgPGFsZ29yaXRobT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBOID0gMjI7CmNvbnN0IGludCBJTkYgPSAxZTk7CgppbnQgbjsKaW50IGFbTl1bTl07ICAgLy8g5Yid5aeL55+p6Zi1CmludCB4W05dW05dOyAgIC8vIOS4u+WKqOe/u+i9rOagh+iusAoKaW50IG1haW4oKSB7CiAgICBjaW4gPj4gbjsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47ICsraSkgewogICAgICAgIHN0cmluZyBzOwogICAgICAgIGNpbiA+PiBzOwogICAgICAgIGZvciAoaW50IGogPSAxOyBqIDw9IG47ICsraikgewogICAgICAgICAgICBhW2ldW2pdID0gc1tqIC0gMV0gLSAnMCc7CiAgICAgICAgfQogICAgfQoKICAgIGludCBhbnMgPSBJTkY7CiAgICAvLyDmnprkuL7nrKzkuIDooYznmoTmiYDmnInnirbmgIHvvIzlhbEgMl5uIOenjQogICAgZm9yIChpbnQgbWFzayA9IDA7IG1hc2sgPCAoMSA8PCBuKTsgKyttYXNrKSB7CiAgICAgICAgbWVtc2V0KHgsIDAsIHNpemVvZiB4KTsKICAgICAgICAvLyDorr7nva7nrKzkuIDooYznmoTnv7vovazmg4XlhrUKICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8PSBuOyArK2opIHsKICAgICAgICAgICAgeFsxXVtqXSA9IChtYXNrID4+IChqIC0gMSkpICYgMTsKICAgICAgICB9CgogICAgICAgIC8vIOmAkuaOqOiuoeeul+esrCAyIH4gbiDooYznmoTnv7vovazmg4XlhrUKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG47ICsraSkgewogICAgICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8PSBuOyArK2opIHsKICAgICAgICAgICAgICAgIC8vIOagueaNruesrCBpIOihjOeahOaWueeoi+ino+WHuiB4W2krMV1bal0KICAgICAgICAgICAgICAgIHhbaSArIDFdW2pdID0gYVtpXVtqXSBeIHhbaV1bal0gXiB4W2kgLSAxXVtqXSBeIHhbaV1baiAtIDFdIF4geFtpXVtqICsgMV07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIOajgOafpeacgOWQjuS4gOihjOaYr+WQpua7oei2s+WFqCAwCiAgICAgICAgYm9vbCBvayA9IHRydWU7CiAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gbjsgKytqKSB7CiAgICAgICAgICAgIGludCB2YWwgPSBhW25dW2pdIF4geFtuXVtqXSBeIHhbbiAtIDFdW2pdIF4geFtuXVtqIC0gMV0gXiB4W25dW2ogKyAxXTsKICAgICAgICAgICAgaWYgKHZhbCAhPSAwKSB7CiAgICAgICAgICAgICAgICBvayA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChvaykgewogICAgICAgICAgICBpbnQgc3VtID0gMDsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgKytpKQogICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gbjsgKytqKQogICAgICAgICAgICAgICAgICAgIHN1bSArPSB4W2ldW2pdOwogICAgICAgICAgICBhbnMgPSBtaW4oYW5zLCBzdW0pOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoYW5zID09IElORikgY291dCA8PCAtMSA8PCBlbmRsOwogICAgZWxzZSBjb3V0IDw8IGFucyA8PCBlbmRsOwoKICAgIHJldHVybiAwOwp9