#include<iostream> #include<sstream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<vector> #include<cmath> #include<set> #include<map> #include<stack> #include<queue> #include<numeric> #include<functional> #include<complex> using namespace std; #define BET(a,b,c) ((a)<=(b)&&(b)<(c)) #define FOR(i,n) for(int i=0,i##_end=(int(n));i<i##_end;i++) #define SZ(x) (int)(x.size()) #define ALL(x) (x).begin(),(x).end() #define MP make_pair #define FOR_EACH(it,v) for(__typeof(v.begin()) it=v.begin(),it_end=v.end() ; it != it_end ; it++) typedef vector<int> VI; typedef vector<VI> VVI; int main() { int n; cin>>n; vector<string> dat(n); FOR(i,n) cin>>dat[i]; VI point(n); vector<pair<int,int> > unknown; FOR(i,n) FOR(j,i) if(i != j){ if(dat[i][j] == 'o'){ point[i]++; }else if(dat[i][j] == '-'){ unknown.push_back(MP(i,j)); } } int ans = 11111; FOR(i,1<<SZ(unknown)){ VI result(point); FOR(j,SZ(unknown)) if(i & (1<<j)) { result[unknown[j].first]++; } else { result[unknown[j].second]++; } VI a; FOR(j,n) { if(result[0] < result[j]) a.push_back(result[j]); } sort(ALL(a)); a.erase(unique(a.begin(),a.end()),a.end()); //FOR(j,n) cout<<" "<<result[j]; cout<<" -> " << SZ(a)<<endl; ans = min(ans, SZ(a) + 1); } cout<<ans<<endl; return 0; }