#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
int dis[10][10];
int dx[5]={-2,-1,1,2};
int dy[5][2]={-1,1,-2,2,-2,2,-1,1};
int x1,x2,y1,y2;
queue <pair<int,int> > q;
bool BFS(int x,int y)
{
pair <int ,int>p;
for (int i=0;i<4;i++)
{
if (x+dx[i]>=1&&x+dx[i]<=8&&y+dy[i][0]>=1&&y+dy[i][0]<=8)
{
if (dis[x+dx[i]][y+dy[i][0]]==-1)
dis[x+dx[i]][y+dy[i][0]]=dis[x][y]+1;
else
dis[x+dx[i]][y+dy[i][0]]=min(dis[x+dx[i]][y+dy[i][0]],dis[x][y]+1);
p.first=x+dx[i];
p.second=y+dy[i][0];
q.push(p);
if (x+dx[i]==x2&&y+dy[i][0]==y2)
return true;
}
if (x+dx[i]>=1&&x+dx[i]<=8&&y+dy[i][1]>=1&&y+dy[i][1]<=8)
{
if (dis[x+dx[i]][y+dy[i][1]]==-1)
dis[x+dx[i]][y+dy[i][1]]=dis[x][y]+1;
else
dis[x+dx[i]][y+dy[i][1]]=min(dis[x+dx[i]][y+dy[i][1]],dis[x][y]+1);
p.first=x+dx[i];
p.second=y+dy[i][1];
q.push(p);
if (x+dx[i]==x2&&y+dy[i][1]==y2)
return true;
}
}
return false;
}
int main()
{
char c,d;
int a,b,x,y;
while (~scanf ("%c %d",&c,&a))
{
getchar();
memset(dis,-1,sizeof(dis));
x1=a;//起点
y1=c-'a'+1;
scanf ("%c %d",&d,&b);
x2=b;
y2=d-'a'+1;
dis[x1][y1]=0;
pair <int,int> p;
p.first=x1;p.second=y1;
q.push(p);
while (!q.empty())
{
x=q.front().first;
y=q.front().second;
if (BFS(x,y))//找到终点就要跳出,否则会死循环,因为每一个点能重复跳跃
break;
q.pop();
}
while(!q.empty())
q.pop();
printf ("To get from %c%d to %c%d takes %d knight moves.\n",c,a,d,b,dis[x2][y2]);
getchar();
}
return 0;
}