#include<bits/stdc++.h>
using namespace std;
#define N 101
struct node {//定义结构体
int x,y,s;//分别为该点的横坐标、纵坐标、步数
}que[N*N];
int book[N][N];//标记数组
int dx[]={-1,-2,-2,-1,1,2,2,1};//马可以向8个方向移动
int dy[]={2,1,-1,-2,-2,-1,1,2};
bool judge(int x,int y) {
if(x>=1&&x<=8&&y>=1&&y<=8&&book[x][y]==0) {//不越界并且这个点没有访问过
return true;
}
return false;
}
int main() {
int head,tail,flag,sx,sy,ex,ey,minn;
char a[10],b[10];
while(~scanf("%s%s",a,b)) {//每组样例为两个字符串
flag=0;//标记变量
head=tail=1;//队头队尾初始化为1
memset(book,0,sizeof(book));//标记数组清零
sx=a[0]-'a'+1;//将字符串中的每个字符转换为对应的ASCII码
sy=a[1]-'0';
ex=b[0]-'a'+1;
ey=b[1]-'0';
if(sx==ex&&sy==ey) {//特判:如果样例输入中起点和终点一样,则直接到达
printf("To get from %s to %s takes 0 knight moves.\n",a,b);
}else {
que[head].x=sx;//起点坐标入队
que[head].y=sy;
que[head].s=0;//步数为0
book[sx][sy]=1;//标记这个点已被访问过
tail++;//起点坐标入队之后,队尾向后移动一格
while(head<tail) {
for(int i=0;i<8;i++) {//8个方向搜索
int tx=que[head].x+dx[i];//下一个点的坐标
int ty=que[head].y+dy[i];
if(judge(tx,ty)) {
que[tail].x=tx;//新的点坐标入队
que[tail].y=ty;
que[tail].s=que[head].s+1;//步数等于上一个点的步数加+1
tail++;//每有一个新的点入队,队尾都要向后移动一格
book[tx][ty]=1;//标记该点
}
if(tx==ex&&ty==ey) {//如果此时走到终点
flag=1;//修改标记变量为1
break;//退出循环
}
}
if(flag==1) {//依次退出循环
break;
}
head++;//未走到终点,队头向后移动一格,继续下一个点的搜索
}
//注意这里的步数,请仔细看代码第43行,走到终点之后,无论如何队尾又向后移动了一格
//之后执行到第46行时,才会判断是否到达终点,进一步退出循环,所以这里对应的是是队尾回退一格的那个点的步数
printf("To get from %s to %s takes %d knight moves.\n",a,b,que[tail-1].s);
}
}
return 0;
}