#include <bits/stdc++.h>
using namespace std;
const long long N = 1000 + 5;
bool v[N][N];
long long n, m, h;
long long first;
long long d[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
char s[N];
struct Poll {
  long long x, y;
  Poll() {}
  Poll(long long x, long long y) : x(x), y(y) {}
} f[N], forbid[N], forbit[N];
inline bool Pd(long long x, long long y) {
  return x >= 1 && x <= n && y >= 1 && y <= m;
}
inline long long Dis(long long a, long long b, long long c, long long d) {
  return abs(a - c) + abs(b - d);
}
inline long long Case(long long x, long long y, long long old, long long vec) {
  if (vec == 0) return old + n * y - n * (m - y);
  if (vec == 1) return old + x * m - (n - x) * m;
  if (vec == 2) return old + n * (m - y + 1) - n * (y - 1);
  if (vec == 3) return old + (n - x + 1) * m - (x - 1) * m;
}
inline long long Part1() {
  long long now = 0, sum = 0;
  for (long long i = 1; i <= n; i++)
    for (long long j = 1; j <= m; j++) now += Dis(1, 1, i, j);
  first = now;
  long long x = 1, y = 1, vec = 0;
  while (1) {
    sum += now;
    v[x][y] = 1;
    long long dx = x + d[vec][0];
    long long dy = y + d[vec][1];
    if (!Pd(dx, dy) || v[dx][dy]) {
      vec = (vec + 1) % 4;
      dx = x + d[vec][0];
      dy = y + d[vec][1];
    }
    if (v[dx][dy]) break;
    now = Case(x, y, now, vec);
    x = dx, y = dy;
  }
  return sum;
}
inline long long Part2() {
  long long sum = 0;
  for (long long i = 1; i <= h; i++) {
    long long now = first;
    for (long long j = 1; j < f[i].x; j++) now = Case(j, 1, now, 1);
    for (long long j = 1; j < f[i].y; j++) now = Case(f[i].x, j, now, 0);
    sum += 2 * now;
  }
  return sum;
}
inline long long Part3() {
  long long sum = 0;
  for (long long i = 1; i <= h; i++)
    for (long long j = i + 1; j <= h; j++)
      sum += 2 * Dis(f[i].x, f[i].y, f[j].x, f[j].y);
  return sum;
}
inline long long Part4() {
  long long sum = 0;
  for (long long i = 1; i <= n; i++)
    if (forbid[i].x) {
      sum += 2 * 2 * (forbid[i].y - 1) * (m - forbid[i].y);
      for (long long j = i - 1; j >= 1; j--)
        if (forbid[j].y > forbid[j + 1].y)
          sum += 2 * 2 * (forbid[i].y - 1) * (m - forbid[j].y);
        else
          break;
      for (long long j = i + 1; j <= n; j++)
        if (forbid[j].y > forbid[j - 1].y)
          sum += 2 * 2 * (forbid[i].y - 1) * (m - forbid[j].y);
        else
          break;
    }
  return sum;
}
inline long long Part5() {
  long long sum = 0;
  for (long long i = 1; i <= m; i++)
    if (forbit[i].x) {
      sum += 2 * 2 * (forbit[i].x - 1) * (n - forbit[i].x);
      for (long long j = i - 1; j >= 1; j--)
        if (forbit[j].x > forbit[j + 1].x)
          sum += 2 * 2 * (forbit[i].x - 1) * (n - forbit[j].x);
        else
          break;
      for (long long j = i + 1; j <= m; j++)
        if (forbit[j].x > forbit[j - 1].x)
          sum += 2 * 2 * (forbit[i].x - 1) * (n - forbit[j].x);
        else
          break;
    }
  return sum;
}
int main() {
  scanf("%I64d %I64d", &n, &m);
  long long blank = 0;
  for (long long i = 1; i <= n; i++) {
    scanf("%s", s + 1);
    for (long long j = 1; j <= m; j++)
      if (s[j] == '.')
        blank++;
      else {
        f[++h] = Poll(i, j);
        forbid[i] = Poll(i, j);
        forbit[j] = Poll(i, j);
      }
  }
  double ans = Part1() - Part2() + Part3() + Part4() + Part5();
  ans /= (double)(blank * blank);
  printf("%.12lf\n", ans);
  return 0;
}
