#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define all(x) (x).begin(),(x).end() #define rep(i,m,n) for(int i = m;i < n;++i) #define pb push_back #define fore(i,a) for(auto &i:a) #define rrep(i,m,n) for(int i = m;i >= n;--i) #define INF INT_MAX/2 using namespace std; using ll = long long; using R = double; using Data = pair>; const ll MOD = 1e9 + 7; const ll inf = 1LL << 50; struct edge { ll from; ll to; ll cost; }; vectors; int n; int check(vectortemp) { vectoru; int st; rep(i, 0, n){ int point = 0; rep(j, 0, n) { if (temp[i][j] == 'o')point++; } u.pb(point); if (i == 0)st = point; } sort(all(u)); u.erase(unique(all(u)),u.end()); sort(all(u)); reverse(all(u)); rep(i,0,u.size()) { if (u[i] == st)return i + 1; } } int main() { cin >> n; rep(i, 0, n) { string temp; cin >> temp; s.pb(temp); } int ans = 101010; rep(msk, 0, 1 << n * (n - 1) / 2) { vectortemp; rep(i, 0, n)temp.pb(s[i]); int cnt = 0; rep(i, 0, n)rep(j, 0, n) { if (i < j) { if (s[i][j] == '-') { int c = (1 << cnt) & msk; temp[i][j] = c ? 'o' : 'x'; temp[j][i] = c ? 'x' : 'o'; } cnt++; } } ans = min(check(temp), ans); } cout << ans << endl; return 0; }