#include <iostream>
#include <vector>
using namespace std;
typedef pair<int,int> PII;// !定义类型
const int N=55;
int n,m;//函数里要用的变量,先定义!
vector<PII> block[2];//定义两个点集,变量名叫block vector<PII> point[2];//两点集
int dr[4]={0,-1,1,0},dc[4]={1,0,0,-1};//!写错了会出现段错误!"相对位置" const int dr[] = { -1, 0, 1, 0 }, dc[] = { 0, 1, 0, -1 };
char p[N][N];
bool st[N][N];//X 1
void dfs(int x,int y,vector<PII> & block) //vector<类型> 变量
{
int i;//只在局部用的,一定要在局部定义
//可以是i,因为主函数的i作为实参,传给形参后,形参便代替了原来的i
st[x][y]=1;//true
block.push_back({x,y});// push_back对 insert错
for(i=0;i<4;i++)
{
int dx = x + dr[i], dy = y + dc[i];//"绝对位置" X的上下左右四点
if(st[dx][dy]||dx<1||dx>n||dy<1||dy>m||p[dx][dy]!='X') continue;//n,m函数中没有新值,则沿用主函数中的n,m
dfs(dx,dy,block);//注意传什么参数
}
}
int main()
{
cin>>n>>m;
int i,j,k=0;
for(i=1;i<=n;i++) cin>>(p[i]+1);//坐标从[1,1]开始
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)//[1,m]
{
if(!st[i][j]&&p[i][j]=='X') dfs(i,j,block[k++]);//
}
}
int ans=1e9+10;
for (PII & a : block[0])//PII &c++11 中新出的写法,意思是枚举 vector容器中的所有元素,此处不支持
for (PII & b : block[1])
ans=min(ans,abs(a.first-b.first)+abs(a.second-b.second));
cout<<ans-1<<endl;
return 0;
}