#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace std;
// #define int short
typedef long long ll;
typedef pair<int , int> PII;
const int M = 2e7 + 10 , inf = 0x3f3f3f3f , N = 1406;
const double PI = 3.1415926535;
typedef pair<short, short> PII;
typedef pair<double , pair<short , short>> PL;
short n , m; // 点的数量
PII e[20000010];
int ne[20000010];
double w[20000010];
int idx; // 邻接表存储所有边
int h[N][N];
double dist[N][N];
bool st[N][N];
// double dist[N]; // 存储所有点到1号点的距离
// bool st[N]; // 存储每个点的最短距离是否已确定
void add(PII a , PII b , double c)
{
e[idx] = b;
w[idx] = c;
ne[idx] = h[a.first][a.second];
h[a.first][a.second] = idx ++;
}
// 求1号点到n号点的最短距离,如果不存在,则返回-1
double dijkstra()
{
// memset(dist, 0x3f, sizeof dist);
for(int i = 1; i <= 2 * n + 2; i ++)
{
for(int j = 1; j <= 2 * m + 2; j ++)
{
dist[i][j] = inf;
}
}
dist[1][1] = 0;
priority_queue<PL, vector<PL>, greater<PL>> heap;
heap.push({0, {1 , 1}}); // first存储距离,second存储节点编号
while (heap.size())
{
auto t = heap.top();
heap.pop();
PII ver = t.second;
double distance = t.first;
if (st[ver.first][ver.second]) continue;
st[ver.first][ver.second] = true;
for (int i = h[ver.first][ver.second]; i != -1; i = ne[i])
{
PII j = e[i];
if (dist[j.first][j.second] > distance + w[i])
{
dist[j.first][j.second] = distance + w[i];
heap.push({dist[j.first][j.second], j});
}
}
}
return dist[2 * n + 1][2 * m + 1];
}
void solve()
{
cin >> n >> m;
for(int i = 0; i <= 2 * n + 2; i ++)
{
for(int j = 0; j <= 2 * m + 2; j ++)
{
h[i][j] = -1;
}
}
for(int i = 1; i < 2 * n; i += 2)
{
for(int j = 1; j < 2 * m; j += 2)
{
// cout << i << ' ' << j << '\n';
char c;
cin >> c;
if(c == 'X')
{
add({i , j} , {i , j + 2} , 10);
add({i , j + 2} , {i , j} , 10);
add({i , j} , {i + 2 , j} , 10);
add({i + 2 , j} , {i , j} , 10);
add({i , j + 2} , {i + 2 , j + 2} , 10);
add({i + 2 , j + 2} , {i , j + 2} , 10);
add({i + 2 , j} , {i + 2 , j + 2} , 10);
add({i + 2 , j + 2} , {i + 2 , j} , 10);
}
else
{
add({i ,j} , {i + 1 , j} , 5);
add({i + 1 , j} , {i , j} , 5);
add({i + 1 , j} , {i + 2 , j} , 5);
add({i + 2 , j} , {i + 1 , j} , 5);
add({i + 2 , j} , {i + 2 , j + 1} , 5);
add({i + 2 , j + 1} , {i + 2 , j} , 5);
add({i + 2 , j + 1} , {i + 2 , j + 2} , 5);
add({i + 2 , j + 2} , {i + 2 , j + 1} , 5);
add({i + 2 , j + 2} , {i + 1 , j + 2} , 5);
add({i + 1 , j + 2} , {i + 2 , j + 2} , 5);
add({i + 1 , j + 2} ,{i , j + 2} , 5);
add({i ,j + 2} , {i + 1 , j + 2} , 5);
add({i , j + 2} , {i , j + 1} , 5);
add({i , j + 1} , {i , j + 2} , 5);
add({i , j + 1} , {i , j} , 5);
add({i , j} , {i , j + 1} , 5);
add({i + 1 , j} , {i , j + 1} , 5 * PI / 2);
add({i , j + 1} , {i + 1 , j} , 5 * PI / 2);
// cout << 5 * PI / 2 << '\n';
add({i , j + 1} , {i + 1 , j + 2} , 5 * PI / 2);
add({i + 1 , j + 2} , {i , j + 1} , 5 * PI / 2);
add({i + 1 , j + 2} , {i + 2 , j + 1} , 5 * PI / 2);
add({i + 2 , j + 1} , {i + 1 , j + 2} , 5 * PI / 2);
add({i + 2 , j + 1} , {i + 1 , j} , 5 * PI / 2);
add({i + 1 , j} , {i + 2 , j + 1} , 5 * PI / 2);
}
}
}
cout << fixed << setprecision(12) << dijkstra() << '\n';
}
signed main()
{
cin.tie(0);cout.tie(0);
ios::sync_with_stdio(false);
int t = 1;
// cin >> t;
while(t --)
{
solve();
}
return 0;
}