#include<bits/stdc++.h>
using namespace std;
 
//定义方向增量
int dx[12]={1,1,-1,-1,2,2,-2,-2};
int dy[12]={-2,2,2,-2,1,-1,1,-1};
int s[200][200];//定义棋盘,保存到达每个步的最少步数 
char a[200][200];//棋盘 
int que[10000][4];
 
int main(){
    int n,m,i,j; 
    int s1,s2,e1,e2;//开始和结束位置 
     
    cin>>m>>n;
    for(i = 1;i <= n;i++){
        for(j = 1;j <= m;j++){
            cin>>a[i][j];
            if(a[i][j] == 'K'){
                s1 = i;
                s2 = j;
            }else if(a[i][j] == 'H'){
                e1 = i;
                e2 = j;
            }
        }
    }
     
    //初始化 
    memset(s,-1,sizeof(s));
    int head=1,tail=1;//初始化队列
    //(s1,s2)点入队,到达该点的最少步数0
    que[1][1]=s1;que[1][2]=s2;que[1][3]=0;
    while(head<=tail){
        //循环8个方向,将所能到达的点入队
        for(int i=0;i<8;i++){
            //马跳跃后的位置
            int x=que[head][1]+dx[i];
            int y=que[head][2]+dy[i];
            //如果没有越界 
            if(x>=1&&y>=1&&x<=n&&y<=m&&a[x][y]!='*'){
                //并且该点没有走过,则点入队 
                if(s[x][y]==-1){
                    s[x][y]=que[head][3]+1; //计算从(s1,s2)到(x,y)的最少步数
                    tail++;//队尾+1
                    //x,y入队
                    que[tail][1]=x;
                    que[tail][2]=y;
                    que[tail][3]=s[x][y];
                    //到达(e1,e2)的最小路径都被求出后输出 
                    if(s[e1][e2]>0){
                        cout<<s[e1][e2]<<endl;
                        return 0;//跳出循环,不再遍历 
                    }
                } 
                 
            }   
        } 
        head++;//出队
    } 
}

/**************************************************************
	Problem: 1441
	User: admin
	Language: C++
	Result: Accepted
	Time:14 ms
	Memory:2424 kb
****************************************************************/