#include <iostream>
#include <string>
#include <cmath>
using namespace std;
// Клетка шахматной доски
struct cell {
int a; // Вертикальная координата (числа)
int b; // Горизонтальная координата (буквы)
int d; // Расстояние до этой клетки из начальной
};
// Узел. Используется в очереди
struct node {
cell val;
node *next;
node(cell v, node *n = NULL) {
val = v;
next = n;
}
};
// Очередь. Используется для поиска в ширину
struct Queue {
node *head;
Queue(node *h = NULL) {
head = h;
}
void push(cell v) { // Добавить элемент в очередь
head = new node(v, head);
}
cell pop() { // Изъять элемент из очереди
if((head -> next) != NULL) {
node *i = head;
node *p = i;
while(i -> next != NULL) {
p = i;
i = i -> next;
}
cell v = i -> val;
p -> next = NULL;
delete i;
return v;
} else {
node *n = head;
cell v = head -> val;
head = head -> next;
delete n;
return v;
}
}
void clear() { // Очистить очередь
head = NULL;
}
};
int main() {
string r; // Строка для запроса
Queue q; // Очередь
cell current, goal, next; // Текущая, конечная и следующая клетки
bool visited[8][8]; // Посещенные клетки
while(getline(cin, r)) {
// Готовим текущую и конечную клетки
current.a = (int)(r[1] - '1');
current.b = (int)(r[0] - 'a');
goal.a = (int)(r[4] - '1');
goal.b = (int)(r[3] - 'a');
current.d = 0;
// Готовим массив посещенных клеток
for(int i = 0; i < 8; i++)
for(int j = 0; j < 8; j++)
visited[i][j] = false;
visited[current.a][current.b] = true;
// Готовим очередь
q.push(current);
// Выполняем поиск в ширину
while( !(current.a == goal.a && current.b == goal.b) ) { // Пока координаты очередной клетки из очереди не совпадут с координатами конечной
current = q.pop(); // Достаем новую клетку из очереди
next.d = current.d + 1; // Расстояние до клеток нового слоя поиска будет на 1 больше, чем до клеток предыдущего
// Перебираем 8 потенцальных ходов из текущей клетки комбинациями сдвигов по координатам
for(int i = -2; i <= 2; i++)
if(i != 0)
for(int j = -(3 - abs(i)); j <= 3 - abs(i); j += 2 * (3 - abs(i))) {
// Присваиваем следующей клетке новые координаты
next.a = current.a + i;
next.b = current.b + j;
if(0 <= next.a && next.a <= 7 && 0 <= next.b && next.b <= 7 && !visited[next.a][next.b]) { // Если следующая клетка находится в пределах доски и не была посещена
q.push(next); // Добавляем ее в очередь
visited[next.a][next.b] = true; // Отмечаем ее посещенной
}
}
}
// Выводим ответ
cout << "To get from " << r[0] << r[1] << " to " << r[3] << r[4] << " takes " << current.d << " knight moves." << endl;
// Очищаем очередь для следующего теста
q.clear();
}
return 0;
}