#include <iostream>
#include <vector>
#include <string>

using namespace std;

void solve(const vector<int>& restriction, int used, int diag, int antidiag, int & ans, int cur, int n)
{
  if (cur >= n)
  {
    ans++;
    return;
  }
  int curused = used;
  curused |= diag;
  curused |= antidiag;
  int curavail = ~curused, next;
  while(1)
  {
    next = curavail & (-curavail);
    if (next >= (1 << n))
      break;
    curavail ^= next;
    if (next & restriction[cur])
      continue;
    solve(restriction, used | next, (diag | next) >> 1, (antidiag | next) << 1, ans, cur + 1, n);
  }
  return;
  
  // for (int i = 0; i < n; i++)
  // {
  //   if (p[cur][i] == '.')
  //     used |= (1 << i);
  // }
  // for (int i = 0; i < cur; i++)
  // {
  //   used |= (1 << a[i]);
  //   if (cur - i <= a[i])
  //     used |= (1 << (a[i] - (cur - i)));
  //   if (a[i] + cur - i < n)
  //     used |= (1 << (a[i] + cur - i));
  // }
  // for (int i = 0; i < n; i++)
  // {
  //   if ((used >> i) & 1)
  //     continue;
  //   a[cur] = i;
  //   solve(p, a, ans, cur + 1, n);
  // }
  // return;
}

int main()
{
  int n;
  cin >> n;
  vector<string> p(n);
  vector<int> restriction(n);
  for (int i = 0; i < n; i++) 
  {
    cin >> p[i];
    for (int j = 0; j < n; j++)
    {
      if (p[i][j] == '.')
	restriction[i] |= (1 << j);
    }
  }
  int ans = 0;
  vector<int> a(n);
  solve(restriction, 0, 0, 0, ans, 0, n);
  cout << ans;
 return 0; 
}
