#include<iostream>
#include<string>
using namespace std;
#define M 200
#define N 10
using namespace std;
struct node
{
int col;//行
int row;//列
int pre;//上一个节点
}sq[M];
int map[N][N]={0};
string str1,str2;
int si,sj,ei,ej;
int dir[8][2]={{2,1},{2,-1},{-2,1},{-2,-1},{1,-2},{1,2},{-1,2},{-1,-2}}; //马每次可能跳的方向
//int map[10][10]
int count_step(node sq[],int rear)//输出路径
{
int i,count=0;
i=rear;
//do
while(i!=0)
{
i=sq[i].pre;
count++;
}
return count;
}
//int map[n2][m2]
void short_way()
{
int i,j,k,front=1,rear=1,x,y;
memset(map,0,sizeof(map)); //初始化
//初始化入口点
sq[front].col=si;//入口点横坐标
sq[front].row=sj;//纵坐标
sq[front].pre=0;//入口点在sq[]中前驱结点为sq[0]
map[si][sj]=-1;//标记入口点已经到达过
if(si==ei&&sj==ej)//起点==终点
{
cout<<"To get from "<<str1<<" to "<<str2<<" "<<"takes "<<0<<" knight moves."<<endl;
return;
}
while(front<=rear)
{
x=sq[front].col;
y=sq[front].row;
for(k=0;k<8;k++)
{
i=x+dir[k][0];
j=y+dir[k][1];
if(map[i][j]==0&&i>=0&&i<8&&j>=0&&j<8)//符合条件的点入队
{
rear++;
sq[rear].col=i;
sq[rear].row=j;
sq[rear].pre=front;
map[i][j]=-1;
}
if(i==ei&&j==ej)//找到了
{
// for(int m=0;m<rear;m++) cout<<sq[m].pre<<" ";cout<<endl;
int flag=count_step(sq,rear);
cout<<"To get from "<<str1<<" to "<<str2<<" "<<"takes "<<flag-1<<" knight moves."<<endl;
return;
}
}
front++;
}
//return 0;//没有路径
}
int main()
{
//freopen("1.txt","r",stdin);
while(cin>>str1>>str2)
{
si = str1[0]-97; //列从0开始,将字符转化为整数,a的ASCII码97
sj = str1[1]-'1';//行也从0开始,将字符整数转化为整数
ei = str2[0]-97;
ej = str2[1]-'1';
short_way();
}
return 0;
}