#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
//英语 看博友分析 抄博友程序 floyd 巧妙 枚举 背
int a[64][64];//国王 从i到j的最短距离
int b[64][64];//骑士
int ax[8]={0,0,1,-1,-1,1,1,-1};//
int ay[8]={1,-1,0,0,1,1,-1,-1};
int bx[8]={-2,-1,1,2,2,1,-1,-2};//
int by[8]={1,2,2,1,-1,-2,-2,-1};
int p[64];//所有棋子的位置
int check(int x,int y)
{
if(x>=0 && x<8 && y>=0 && y<8)
{
return 1;
}
return 0;
}
void getxy(int a,int& x,int& y)//抄博友程序
{
x=a/8;
y=a%8;
}
int main()
{
memset(a,0x3f,sizeof(a));
memset(b,0x3f,sizeof(b));
for(int i=0;i<64;i++)
{
a[i][i]=0;
b[i][i]=0;
}
for(int i=0;i<64;i++)
{
int x,y;
getxy(i,x,y);
for(int k=0;k<8;k++)
{
int tx=x+ax[k];
int ty=y+ay[k];
if(check(tx,ty))
{
int j=tx*8+ty;
a[i][j]=1;
}
tx=x+bx[k];
ty=y+by[k];
if(check(tx,ty))
{
int j=tx*8+ty;
b[i][j]=1;
}
}
}
for(int k=0;k<64;k++)
{
for(int i=0;i<64;i++)
{
for(int j=0;j<64;j++)
{
if(a[i][j]>(a[i][k]+a[k][j]))
{
a[i][j]=a[i][k]+a[k][j];
}
if(b[i][j]>(b[i][k]+b[k][j]))
{
b[i][j]=b[i][k]+b[k][j];
}
}
}
}
/*
for(int i=0;i<64;i++)
{
for(int j=0;j<64;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
for(int i=0;i<64;i++)
{
for(int j=0;j<64;j++)
{
cout<<b[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;*/
string s;
cin>>s;
int cnt=0;
for(int i=0;i<s.size();i=i+2)//抄博友程序
{
p[cnt++]=(s[i]-'A')*8+(s[i+1]-'1');//抄博友程序
}
int ans=0x3f3f3f3f;
for(int i=0;i<64;i++)//枚举终止位置 背
{
int sum=0;
for(int j=1;j<cnt;j++)//枚举骑士
{
sum=sum+b[i][p[j]];
}
for(int j=1;j<cnt;j++)//枚举骑士
{
for(int k=0;k<64;k++)//枚举国王与骑士相遇位置
{
int t=sum+a[p[0]][k]+b[p[j]][k]+b[k][i]-b[p[j]][i];//抄博友程序 背
if(t<ans)
{
ans=t;
}
}
}
}
cout<<ans<<endl;
return 0;
}