1 import java.util.Scanner;
2
3 public class Main {
4 static int max = 0;
5
6 static boolean canPut(int x, int y, char[] board, int n) {
7 // up
8 for (int i = x - 1; i >= 0; i--) {
9 if (board[i * n + y] == 'O')
10 return false;
11 else if (board[x * n + i] == 'X')
12 break;
13 }
14 // left
15 for (int i = y - 1; i >= 0; i--) {
16 if (board[x * n + i] == 'O')
17 return false;
18 else if (board[x * n + i] == 'X')
19 break;
20 }
21 return true;
22 }
23
24 static void find(char[] board, int k, int currMax, int n) {
25 if (k == n * n) {
26 if (currMax > max)
27 max = currMax;
28 return;
29 } else {
30 if (board[k] == '.' && canPut(k / n, k % n, board, n)) {
31 board[k] = 'O';
32 find(board, k + 1, currMax + 1, n);
33 board[k] = '.';
34 }
35 find(board, k + 1, currMax, n);
36 }
37 }
38
39 public static void main(String[] args) {
40 Scanner sc = new Scanner(System.in);
41 int n;
42
43 while ((n = sc.nextInt()) != 0) {
44 char[] board = new char[n * n];
45
46 // get board
47 for (int i = 0; i < n; i++) {
48 String stmp = sc.next();
49 char[] ctmp = stmp.toCharArray();
50 for (int j = 0; j < n; j++) {
51 board[i * n + j] = ctmp[j];
52 }
53 }
54
55 find(board, 0, 0, n);
56
57 System.out.println(max);
58 max = 0;
59 }
60 }
61 }