#include
#include
#include
#include
#include
#include
using namespace std;
char mat[105][105];
bool visited[105][105][1 << 8];
int main()
{
int n, m;
cin >> n >> m;
int si, sj;
int ei, ej;
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
cin >> mat[i][j];
if(mat[i][j] == 'P') { // pocetok
si = i;
sj = j;
}
if(mat[i][j] == 'K') {
ei = i;
ej = j;
}
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
for(int mask = 0; mask < (1 << 8); mask++) {
visited[i][j][mask] = false;
}
}
}
queue q;
q.push(si);
q.push(sj);
q.push(0); // koi klucevi do sega sme gi zemale
q.push(0); // kolku cekori do tuka sme pominale
visited[si][sj][0] = true;
int di[] = {-1, 1, 0, 0};
int dj[] = {0, 0, -1, 1};
while(!q.empty()) {
int ci = q.front();
q.pop();
int cj = q.front();
q.pop();
int bitmask = q.front();
q.pop();
int cekor = q.front();
q.pop();
if(mat[ci][cj] == 'K') {
cout << cekor << endl;
return 0;
}
for(int i = 0; i < 4; i++) {
int ti = ci + di[i];
int tj = cj + dj[i];
if(ti >= 0 and ti < n and tj >= 0 and tj < m and mat[ti][tj] != '#') {
if(mat[ti][tj] >= 'a' and mat[ti][tj] <= 'h') {
int bukva = mat[ti][tj] - 'a';
int zemeno = bitmask | (1 << bukva);
if(!visited[ti][tj][zemeno]) {
visited[ti][tj][zemeno] = true;
q.push(ti);
q.push(tj);
q.push(zemeno);
q.push(cekor + 1);
}
}
else if(mat[ti][tj] >= 'A' and mat[ti][tj] <= 'H') {
int bukva = mat[ti][tj] - 'A';
if(bitmask & (1 << bukva)) {
if(!visited[ti][tj][bitmask]) {
q.push(ti);
q.push(tj);
q.push(bitmask);
q.push(cekor + 1);
visited[ti][tj][bitmask] = true;
}
}
}
else {
if(!visited[ti][tj][bitmask]) {
visited[ti][tj][bitmask] = true;
q.push(ti);
q.push(tj);
q.push(bitmask);
q.push(cekor + 1);
}
}
}
}
}
cout << "Ne moze da se stigne do kraj" << endl;
return 0;
}
/*
P..A
..#K
...#
a...
10 10
P.....d..f
####F#D###
..........
......h..b
.#####H###
.#....a...
.#.###A###
.#.#...c..
.#.#.####C
.B.#.#...K
*/