/*
首先要知道国际象棋马是怎么走的:
先直走一步,再斜走一步
*/
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 160;
typedef pair<int, int> PII;
vector<PII> que;
int C, R;
char g[N][N];
int dist[N][N];
// 方向都是很有规律的
int dx[8] = {1, 1, -1, -1, 2, 2, -2, -2};
int dy[8] = {2, -2, 2, -2, 1, -1, 1, -1};
int bfs(PII st) {
que.clear();
memset(dist, -1, sizeof dist);
int ans = -1;
que.push_back(st);
dist[st.first][st.second] = 0;
for(int i = 0; i < que.size(); i++) {
auto cur = que[i];
int x = cur.first, y = cur.second;
// printf("%d %d\n", x, y);
// 剪枝,不减记录终点直接dist[ed.first][ed.second]也行
if(g[x][y] == 'H') {
ans = dist[x][y];
// puts("??");
break;
}
for(int j = 0; j < 8; j++) {
int tx = x+dx[j], ty = y+dy[j];
// printf("##%d %d\n", tx, ty);
if(tx < 0 || tx >= R || ty < 0 || ty >= C) continue;//防止越界
if(g[tx][ty] == '*' || dist[tx][ty] != -1) continue;//防止障碍物和重复路径
que.push_back({tx, ty});
// printf("%d %d\n", tx, ty);
dist[tx][ty] = dist[x][y]+1;//更新距离
}
// cout <<endl;
}
return ans;
}
int main()
{
scanf("%d%d", &C, &R);//这里是先列后行
PII st;
// 读的时候是先行后列
for(int i = 0; i < R; i++) {
for(int j = 0; j < C; j++) {
scanf(" %c", &g[i][j]);
if(g[i][j] == 'K') {
st = {i, j};//记录起点
}
}
}
// for(int i = 0; i < R; i++) {
// for(int j = 0; j < C; j++) {
// printf(" %c", g[i][j]);
// }
// cout << endl;
// }
cout << bfs(st) << endl; //数据保证一定有解
return 0;
}