//188.武士风度的牛:最短路径问题,直接BFS遍历就ok了,模版题~~~
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int DX[8]={2,1,-1,-2,-2,-1, 1, 2};
int DY[8]={1,2,2 ,1, -1,-2,-2,-1};
const int N=155;
char map[N][N];
int c,r,dis[N][N],sx,sy;//c列r行, dis存储距离Knight的距离 ,sx sy标记 knight起初的坐标
struct Node
{
int x,y;
};
//宽度优先搜索
int bfs(int sx, int sy)
{
queue<Node> q;
memset(dis,-1,sizeof(dis));
dis[sx][sy]=0;
Node temp;
temp.x=sx,temp.y=sy;
q.push(temp);
while(!q.empty())
{
Node t=q.front();
q.pop();
for(int i=0;i<8;i++)
{
int dx=t.x+DX[i],dy=t.y+DY[i];
if(map[dx][dy]=='*'||dx<0||dx>=r||dy<0||dy>=c||dis[dx][dy]!=-1)
continue;
if(map[dx][dy]=='H') return dis[t.x][t.y]+1;
Node w;
w.x=dx,w.y=dy;
q.push(w);
dis[dx][dy]=dis[t.x][t.y]+1;
}
}
}
int main()
{
char tem;//临时字符存放变量
cin>>c>>r;
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
cin>>map[i][j];
if(map[i][j]=='K')
{
sx=i;
sy=j;
}
}
}
cout<<bfs(sx,sy)<<endl;
return 0;
}