#include <bits/stdc++.h>
using namespace std;
char data[50][50];
int calc[51][51];
int dp[50][50][50][50];
int take(int l, int u, int r, int d) {
  return calc[d + 1][r + 1] - calc[d + 1][l] - calc[u][r + 1] + calc[u][l];
}
void init(int n) {
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      calc[i + 1][j + 1] =
          calc[i][j + 1] + calc[i + 1][j] - calc[i][j] + (data[i][j] == '#');
    }
  }
}
int main() {
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      cin >> data[i][j];
    }
  }
  init(n);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      for (int k = 0; k + i < n; k++) {
        for (int t = 0; t + j < n; t++) {
          auto& target = dp[k][t][k + i][t + j];
          if (take(t, k, t + j, k + i) != 0) {
            target = max(i + 1, j + 1);
            for (int e = t; e < t + j; e++) {
              target =
                  min(target, dp[k][t][k + i][e] + dp[k][e + 1][k + i][t + j]);
            }
            for (int e = k; e < k + i; e++) {
              target =
                  min(target, dp[k][t][e][t + j] + dp[e + 1][t][k + i][t + j]);
            }
          } else {
            target = 0;
          }
        }
      }
    }
  }
  cout << dp[0][0][n - 1][n - 1] << endl;
  return 0;
}
