#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> row(n, 0); // 存储每一行初始矩阵的二进制表示
for (int i = 0; i < n; ++i) {
string s;
cin >> s;
int num = 0;
for (int j = 0; j < n; ++j) {
if (s[j] == '1') num |= (1 << j); // 第 j 位对应列 j
}
row[i] = num;
}
int mask_all = (1 << n) - 1; // 用于截断低 n 位的掩码
int ans = INT_MAX;
// 枚举第一行的翻转状态
for (int mask = 0; mask < (1 << n); ++mask) {
int pre2 = 0; // 上上行
int pre1 = mask; // 上一行,初始为第一行
int cost = __builtin_popcount(mask); // 主动翻转的代价
bool valid = true;
// 递推计算第 1 行到第 n-1 行(0-based 索引)
for (int i = 1; i < n; ++i) {
// 通过位运算一次性计算当前行的翻转状态
int cur = (row[i - 1] ^ pre1 ^ pre2 ^ (pre1 << 1) ^ (pre1 >> 1)) & mask_all;
cost += __builtin_popcount(cur);
if (cost >= ans) { // 剪枝:当前代价已不小于已知最优解
valid = false;
break;
}
pre2 = pre1;
pre1 = cur;
}
if (!valid) continue;
// 验证最后一行是否满足全0条件
int val = (row[n - 1] ^ pre1 ^ pre2 ^ (pre1 << 1) ^ (pre1 >> 1)) & mask_all;
if (val == 0) {
ans = min(ans, cost);
}
}
if (ans == INT_MAX) cout << -1 << endl;
else cout << ans << endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbWFpbigpIHsKICAgIGludCBuOwogICAgY2luID4+IG47CiAgICB2ZWN0b3I8aW50PiByb3cobiwgMCk7ICAgICAgICAgIC8vIOWtmOWCqOavj+S4gOihjOWIneWni+efqemYteeahOS6jOi/m+WItuihqOekugogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBzdHJpbmcgczsKICAgICAgICBjaW4gPj4gczsKICAgICAgICBpbnQgbnVtID0gMDsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47ICsraikgewogICAgICAgICAgICBpZiAoc1tqXSA9PSAnMScpIG51bSB8PSAoMSA8PCBqKTsgICAvLyDnrKwgaiDkvY3lr7nlupTliJcgagogICAgICAgIH0KICAgICAgICByb3dbaV0gPSBudW07CiAgICB9CgogICAgaW50IG1hc2tfYWxsID0gKDEgPDwgbikgLSAxOyAgICAvLyDnlKjkuo7miKrmlq3kvY4gbiDkvY3nmoTmjqnnoIEKICAgIGludCBhbnMgPSBJTlRfTUFYOwoKICAgIC8vIOaemuS4vuesrOS4gOihjOeahOe/u+i9rOeKtuaAgQogICAgZm9yIChpbnQgbWFzayA9IDA7IG1hc2sgPCAoMSA8PCBuKTsgKyttYXNrKSB7CiAgICAgICAgaW50IHByZTIgPSAwOyAgICAgICAgICAgICAgIC8vIOS4iuS4iuihjAogICAgICAgIGludCBwcmUxID0gbWFzazsgICAgICAgICAgICAvLyDkuIrkuIDooYzvvIzliJ3lp4vkuLrnrKzkuIDooYwKICAgICAgICBpbnQgY29zdCA9IF9fYnVpbHRpbl9wb3Bjb3VudChtYXNrKTsgICAvLyDkuLvliqjnv7vovaznmoTku6Pku7cKICAgICAgICBib29sIHZhbGlkID0gdHJ1ZTsKCiAgICAgICAgLy8g6YCS5o6o6K6h566X56ysIDEg6KGM5Yiw56ysIG4tMSDooYzvvIgwLWJhc2VkIOe0ouW8le+8iQogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICAgIC8vIOmAmui/h+S9jei/kOeul+S4gOasoeaAp+iuoeeul+W9k+WJjeihjOeahOe/u+i9rOeKtuaAgQogICAgICAgICAgICBpbnQgY3VyID0gKHJvd1tpIC0gMV0gXiBwcmUxIF4gcHJlMiBeIChwcmUxIDw8IDEpIF4gKHByZTEgPj4gMSkpICYgbWFza19hbGw7CiAgICAgICAgICAgIGNvc3QgKz0gX19idWlsdGluX3BvcGNvdW50KGN1cik7CiAgICAgICAgICAgIGlmIChjb3N0ID49IGFucykgeyAgICAgIC8vIOWJquaene+8muW9k+WJjeS7o+S7t+W3suS4jeWwj+S6juW3suefpeacgOS8mOinowogICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByZTIgPSBwcmUxOwogICAgICAgICAgICBwcmUxID0gY3VyOwogICAgICAgIH0KICAgICAgICBpZiAoIXZhbGlkKSBjb250aW51ZTsKCiAgICAgICAgLy8g6aqM6K+B5pyA5ZCO5LiA6KGM5piv5ZCm5ruh6Laz5YWoMOadoeS7tgogICAgICAgIGludCB2YWwgPSAocm93W24gLSAxXSBeIHByZTEgXiBwcmUyIF4gKHByZTEgPDwgMSkgXiAocHJlMSA+PiAxKSkgJiBtYXNrX2FsbDsKICAgICAgICBpZiAodmFsID09IDApIHsKICAgICAgICAgICAgYW5zID0gbWluKGFucywgY29zdCk7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChhbnMgPT0gSU5UX01BWCkgY291dCA8PCAtMSA8PCBlbmRsOwogICAgZWxzZSBjb3V0IDw8IGFucyA8PCBlbmRsOwoKICAgIHJldHVybiAwOwp9