#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 a[200][200];//定义棋盘,保存到达每个步的最少步数 
char b[200][200];//棋盘 
int c[10000][4];
int main(){
    int m,n; 
    int q,w,e,r;//开始和结束位置 
    cin>>m>>n;
    int i,j;//定义i,j
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++){
            cin>>b[i][j];
            if(b[i][j]=='K'){
                q=i;
                w=j;
            }else{
            	if(b[i][j]=='H'){
              		e=i;
               		r=j;
            	}	
            }
        }
    }
	memset(a,-1,sizeof(a));//初始化 
	int g=1,h=1;//初始化队列
	c[1][1]=q;
	c[1][2]=w;
	c[1][3]=0;//(s1,s2)点入队,到达该点的最少步数0
    while(g<=h){
        //循环8个方向,将所能到达的点入队
        for(int i=0;i<8;i++){//马跳跃后的位置
            int x=c[g][1]+dx[i];
            int y=c[g][2]+dy[i];
            //如果没有越界 
            if(x>=1&&y>=1&&x<=n&&y<=m&&a[x][y]!='*'){
                //并且该点没有走过,则点入队 
                if(a[x][y]==-1){
                    a[x][y]=c[g][3]+1; //计算从(s1,s2)到(x,y)的最少步数
                    h++;//队尾+1
                    //x,y入队
                    c[h][1]=x;
                    c[h][2]=y;
                    c[h][3]=a[x][y];
                    //到达(e,r)的最小路径都被求出后输出 
                    if(a[e][r]>0){
                        cout<<a[e][r]<<endl;
                        return 0;
						//跳出循环,不再遍历 
                    }
                }    
            }   
        } 
        g++;//出队
    } 
	return 0;//返回0 
}
/**************************************************************
	Problem: 1441
	User: linxichen
	Language: C++
	Result: Accepted
	Time:16 ms
	Memory:2424 kb
****************************************************************/