# include <iostream>
# include <cstdlib>
# include <cstdio>
# include <limits>
# include <map>
# include <queue>
using namespace std;
struct Node
{
int X, Y;
Node ( int x = 0 , int y = 0 ) { X = x; Y = y; }
bool operator < ( const Node & node) const
{
if ( X == node.X )
{
return ( Y < node.Y ) ;
}
return ( X < node.X ) ;
}
} ;
map < Node, int > Distances;
queue < Node> Queue;
Node Start, End;
void Update ( Node node, Node node1)
{
if ( Distances.find ( node1) == Distances.end ( ) )
{
Distances [ node1] = Distances [ node] + 1 ;
if ( node1.X ! = End.X || node1.Y ! = End.Y )
Queue.push ( node1) ;
}
else
{
if ( Distances [ node] + 1 < Distances[ node1] )
{
Distances [ node1] = Distances [ node] + 1 ;
if ( node1.X ! = End.X || node1.Y ! = End.Y )
Queue.push ( node1) ;
}
}
}
int main( int argc, char const * argv[ ] )
{
//freopen ("439_Knight_Moves_input.txt", "r", stdin);
//freopen ("439_Knight_Moves_output.txt", "w", stdout);
string str1, str2;
while ( cin >> str1 >> str2)
{
Start.X = str1[ 0 ] - 97 ; Start.Y = str1[ 1 ] - 49 ;
End.X = str2[ 0 ] - 97 ; End.Y = str2[ 1 ] - 49 ;
Distances.clear ( ) ;
Distances [ Start] = 0 ;
Distances [ End] = numeric_limits < int > :: max ( ) ;
if ( Start.X ! = End.X || Start.Y ! = End.Y )
Queue.push ( Start) ;
else
Distances [ End] = 0 ;
while ( Queue.empty ( ) == false )
{
Node node = Queue.front ( ) ;
Queue.pop ( ) ;
//cout << "Popping "
if ( node.X + 1 < 8 && node.Y + 2 < 8 )
Update ( node, Node ( node.X + 1 , node.Y + 2 ) ) ;
if ( node.X + 2 < 8 && node.Y + 1 < 8 )
Update ( node, Node ( node.X + 2 , node.Y + 1 ) ) ;
if ( node.X + 1 < 8 && node.Y - 2 >= 0 )
Update ( node, Node ( node.X + 1 , node.Y - 2 ) ) ;
if ( node.X + 2 < 8 && node.Y - 1 >= 0 )
Update ( node, Node ( node.X + 2 , node.Y - 1 ) ) ;
if ( node.X - 1 >= 0 && node.Y + 2 < 8 )
Update ( node, Node ( node.X - 1 , node.Y + 2 ) ) ;
if ( node.X - 2 >= 0 && node.Y + 1 < 8 )
Update ( node, Node ( node.X - 2 , node.Y + 1 ) ) ;
if ( node.X - 1 >= 0 && node.Y - 2 >= 0 )
Update ( node, Node ( node.X - 1 , node.Y - 2 ) ) ;
if ( node.X - 2 >= 0 && node.Y - 1 >= 0 )
Update ( node, Node ( node.X - 2 , node.Y - 1 ) ) ;
}
//if (cin.eof())
// cout << "To get from " << str1 << " to " << str2 << " takes " << Distances [End] << " knight moves.";
//else
cout << "To get from " << str1 << " to " << str2 << " takes " << Distances [ End] << " knight moves." << endl;
}
return 0 ;
}
IyBpbmNsdWRlIDxpb3N0cmVhbT4KIyBpbmNsdWRlIDxjc3RkbGliPgojIGluY2x1ZGUgPGNzdGRpbz4KIyBpbmNsdWRlIDxsaW1pdHM+CiMgaW5jbHVkZSA8bWFwPgojIGluY2x1ZGUgPHF1ZXVlPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpzdHJ1Y3QgTm9kZQp7CiAgICBpbnQgWCwgWTsKCU5vZGUgKGludCB4ID0gMCwgaW50IHkgPSAwKSB7WCA9IHg7IFkgPSB5O30KCWJvb2wgb3BlcmF0b3IgPCAoY29uc3QgTm9kZSAmIG5vZGUpIGNvbnN0Cgl7CgkJaWYgKFggPT0gbm9kZS5YKQoJCXsKCQkJcmV0dXJuIChZIDwgbm9kZS5ZKTsKCQl9CgkJcmV0dXJuIChYIDwgbm9kZS5YKTsKCX0KfTsKbWFwIDxOb2RlLCBpbnQ+IERpc3RhbmNlczsKcXVldWUgPE5vZGU+IFF1ZXVlOwpOb2RlIFN0YXJ0LCBFbmQ7CnZvaWQgVXBkYXRlIChOb2RlIG5vZGUsIE5vZGUgbm9kZTEpCnsKCWlmIChEaXN0YW5jZXMuZmluZCAobm9kZTEpID09IERpc3RhbmNlcy5lbmQoKSkKCXsKCQlEaXN0YW5jZXMgW25vZGUxXSA9IERpc3RhbmNlcyBbbm9kZV0gKyAxOwoJCWlmIChub2RlMS5YICE9IEVuZC5YIHx8IG5vZGUxLlkgIT0gRW5kLlkpCgkJCVF1ZXVlLnB1c2ggKG5vZGUxKTsKCX0KCWVsc2UKCXsKCQlpZiAoRGlzdGFuY2VzIFtub2RlXSArIDEgPCBEaXN0YW5jZXNbbm9kZTFdKQoJCXsKCQkJRGlzdGFuY2VzIFtub2RlMV0gPSBEaXN0YW5jZXMgW25vZGVdICsgMTsKCQkJaWYgKG5vZGUxLlggIT0gRW5kLlggfHwgbm9kZTEuWSAhPSBFbmQuWSkKCQkJCVF1ZXVlLnB1c2ggKG5vZGUxKTsKCQl9Cgl9Cn0KaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgY29uc3QgKmFyZ3ZbXSkKewoJLy9mcmVvcGVuICgiNDM5X0tuaWdodF9Nb3Zlc19pbnB1dC50eHQiLCAiciIsIHN0ZGluKTsKCS8vZnJlb3BlbiAoIjQzOV9LbmlnaHRfTW92ZXNfb3V0cHV0LnR4dCIsICJ3Iiwgc3Rkb3V0KTsKCXN0cmluZyBzdHIxLCBzdHIyOwoJd2hpbGUgKGNpbiA+PiBzdHIxID4+IHN0cjIpCgl7CgkJU3RhcnQuWCA9IHN0cjFbMF0tOTc7IFN0YXJ0LlkgPSBzdHIxWzFdLTQ5OwoJCUVuZC5YICAgPSBzdHIyWzBdLTk3OyBFbmQuWSAgID0gc3RyMlsxXS00OTsKCQlEaXN0YW5jZXMuY2xlYXIoKTsKCQlEaXN0YW5jZXMgW1N0YXJ0XSA9IDA7CgkJRGlzdGFuY2VzIFtFbmRdICAgPSBudW1lcmljX2xpbWl0cyA8aW50Pjo6bWF4KCk7CgkJaWYgKFN0YXJ0LlggIT0gRW5kLlggfHwgU3RhcnQuWSAhPSBFbmQuWSkKCQkJUXVldWUucHVzaCAoU3RhcnQpOwoJCWVsc2UKCQkJRGlzdGFuY2VzIFtFbmRdID0gMDsKCQl3aGlsZSAoUXVldWUuZW1wdHkoKSA9PSBmYWxzZSkKCQl7CgkJCU5vZGUgbm9kZSA9IFF1ZXVlLmZyb250KCk7CgkJCVF1ZXVlLnBvcCgpOwoJCQkvL2NvdXQgPDwgIlBvcHBpbmcgIiAKCQkJaWYgKG5vZGUuWCArIDEgPCA4ICYmIG5vZGUuWSArIDIgPCA4KQoJCQkJVXBkYXRlIChub2RlLCBOb2RlIChub2RlLlggKyAxLCBub2RlLlkgKyAyKSk7CgkJCWlmIChub2RlLlggKyAyIDwgOCAmJiBub2RlLlkgKyAxIDwgOCkKCQkJCVVwZGF0ZSAobm9kZSwgTm9kZSAobm9kZS5YICsgMiwgbm9kZS5ZICsgMSkpOwoJCQlpZiAobm9kZS5YICsgMSA8IDggJiYgbm9kZS5ZIC0gMiA+PSAwKQoJCQkJVXBkYXRlIChub2RlLCBOb2RlIChub2RlLlggKyAxLCBub2RlLlkgLSAyKSk7CgkJCWlmIChub2RlLlggKyAyIDwgOCAmJiBub2RlLlkgLSAxID49IDApCgkJCQlVcGRhdGUgKG5vZGUsIE5vZGUgKG5vZGUuWCArIDIsIG5vZGUuWSAtIDEpKTsKCQkJaWYgKG5vZGUuWCAtIDEgPj0gMCAmJiBub2RlLlkgKyAyIDwgOCkKCQkJCVVwZGF0ZSAobm9kZSwgTm9kZSAobm9kZS5YIC0gMSwgbm9kZS5ZICsgMikpOwoJCQlpZiAobm9kZS5YIC0gMiA+PSAwICYmIG5vZGUuWSArIDEgPCA4KQoJCQkJVXBkYXRlIChub2RlLCBOb2RlIChub2RlLlggLSAyLCBub2RlLlkgKyAxKSk7CgkJCWlmIChub2RlLlggLSAxID49IDAgJiYgbm9kZS5ZIC0gMiA+PSAwKQoJCQkJVXBkYXRlIChub2RlLCBOb2RlIChub2RlLlggLSAxLCBub2RlLlkgLSAyKSk7CgkJCWlmIChub2RlLlggLSAyID49IDAgJiYgbm9kZS5ZIC0gMSA+PSAwKQoJCQkJVXBkYXRlIChub2RlLCBOb2RlIChub2RlLlggLSAyLCBub2RlLlkgLSAxKSk7CgkJfQoJCS8vaWYgKGNpbi5lb2YoKSkKCQkvLwljb3V0IDw8ICJUbyBnZXQgZnJvbSAiIDw8IHN0cjEgPDwgIiB0byAiIDw8IHN0cjIgPDwgIiB0YWtlcyAiIDw8IERpc3RhbmNlcyBbRW5kXSA8PCAiIGtuaWdodCBtb3Zlcy4iOwoJCS8vZWxzZQoJCQljb3V0IDw8ICJUbyBnZXQgZnJvbSAiIDw8IHN0cjEgPDwgIiB0byAiIDw8IHN0cjIgPDwgIiB0YWtlcyAiIDw8IERpc3RhbmNlcyBbRW5kXSA8PCAiIGtuaWdodCBtb3Zlcy4iIDw8IGVuZGw7Cgl9CglyZXR1cm4gMDsKfQ==