//小弟新手,只能用最简单的枚举法将所有的可能列举出来,然后比较出最大值
#include<iostream> #include<cmath> using namespace std; char a[4][4]; int b[16]; int main() { int n, i, j, k; int count, temp; bool f(int); while (cin >> n&&n != 0) { count = -1; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { cin >> a[i][j]; b[i*n+j] = 0; } } b[0] = -1; for (i = 0; i < (int)pow(2.0, (double)(n*n)); i++) { b[0]++; for (j = 0; j < n*n - 1; j++) { if (b[j] == 2) { b[j] = 0; b[j + 1]++; } } for (j = 0; j < n; j++) { for (k = 0; k < n; k++) { if (b[j*n + k] == 1 && a[j][k] != 'X')a[j][k] = 'O'; if (b[j*n + k] == 0 && a[j][k] != 'X')a[j][k] = '.'; } } if (f(n)) { temp = 0; for (k = 0; k < n; k++) { for (j = 0; j < n; j++) { if (a[k][j] == 'O')temp++; } } if (temp>count)count = temp; } } cout << count << endl; } return 0; } bool f(int n) { for (int i = 0; i < n; i++) { int flag1 = 0, flag2 = 0; for (int j = 0; j < n; j++) { if (a[i][j] == 'X')flag1 = 0; if (a[j][i] == 'X')flag2 = 0; if (a[i][j] == 'O')flag1++; if (a[j][i] == 'O')flag2++; } if (flag1>1 || flag2>1)return 0; } return 1; }