# include <iostream>
# include <string>
# 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 ) ) ;
}
cout << "To get from " << str1 << " to " << str2 << " takes " << Distances [ End] << " knight moves." << endl;
}
return 0 ;
}
IyBpbmNsdWRlIDxpb3N0cmVhbT4KIyBpbmNsdWRlIDxzdHJpbmc+CiMgaW5jbHVkZSA8Y3N0ZGxpYj4KIyBpbmNsdWRlIDxjc3RkaW8+CiMgaW5jbHVkZSA8bGltaXRzPgojIGluY2x1ZGUgPG1hcD4KIyBpbmNsdWRlIDxxdWV1ZT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKc3RydWN0IE5vZGUKewogICAgaW50IFgsIFk7CglOb2RlIChpbnQgeCA9IDAsIGludCB5ID0gMCkge1ggPSB4OyBZID0geTt9Cglib29sIG9wZXJhdG9yIDwgKGNvbnN0IE5vZGUgJiBub2RlKSBjb25zdAoJewoJCWlmIChYID09IG5vZGUuWCkKCQl7CgkJCXJldHVybiAoWSA8IG5vZGUuWSk7CgkJfQoJCXJldHVybiAoWCA8IG5vZGUuWCk7Cgl9Cn07Cm1hcCA8Tm9kZSwgaW50PiBEaXN0YW5jZXM7CnF1ZXVlIDxOb2RlPiBRdWV1ZTsKTm9kZSBTdGFydCwgRW5kOwp2b2lkIFVwZGF0ZSAoTm9kZSBub2RlLCBOb2RlIG5vZGUxKQp7CglpZiAoRGlzdGFuY2VzLmZpbmQgKG5vZGUxKSA9PSBEaXN0YW5jZXMuZW5kKCkpCgl7CgkJRGlzdGFuY2VzIFtub2RlMV0gPSBEaXN0YW5jZXMgW25vZGVdICsgMTsKCQlpZiAobm9kZTEuWCAhPSBFbmQuWCB8fCBub2RlMS5ZICE9IEVuZC5ZKQoJCQlRdWV1ZS5wdXNoIChub2RlMSk7Cgl9CgllbHNlCgl7CgkJaWYgKERpc3RhbmNlcyBbbm9kZV0gKyAxIDwgRGlzdGFuY2VzW25vZGUxXSkKCQl7CgkJCURpc3RhbmNlcyBbbm9kZTFdID0gRGlzdGFuY2VzIFtub2RlXSArIDE7CgkJCWlmIChub2RlMS5YICE9IEVuZC5YIHx8IG5vZGUxLlkgIT0gRW5kLlkpCgkJCQlRdWV1ZS5wdXNoIChub2RlMSk7CgkJfQoJfQp9CmludCBtYWluKGludCBhcmdjLCBjaGFyIGNvbnN0ICphcmd2W10pCnsKCS8vZnJlb3BlbiAoIjQzOV9LbmlnaHRfTW92ZXNfaW5wdXQudHh0IiwgInIiLCBzdGRpbik7CgkvL2ZyZW9wZW4gKCI0MzlfS25pZ2h0X01vdmVzX291dHB1dC50eHQiLCAidyIsIHN0ZG91dCk7CglzdHJpbmcgc3RyMSwgc3RyMjsKCXdoaWxlIChjaW4gPj4gc3RyMSA+PiBzdHIyKQoJewoJCVN0YXJ0LlggPSBzdHIxWzBdLTk3OyBTdGFydC5ZID0gc3RyMVsxXS00OTsKCQlFbmQuWCAgID0gc3RyMlswXS05NzsgRW5kLlkgICA9IHN0cjJbMV0tNDk7CgkJRGlzdGFuY2VzLmNsZWFyKCk7CgkJRGlzdGFuY2VzIFtTdGFydF0gPSAwOwoJCURpc3RhbmNlcyBbRW5kXSAgID0gbnVtZXJpY19saW1pdHMgPGludD46Om1heCgpOwoJCWlmIChTdGFydC5YICE9IEVuZC5YIHx8IFN0YXJ0LlkgIT0gRW5kLlkpCgkJCVF1ZXVlLnB1c2ggKFN0YXJ0KTsKCQllbHNlCgkJCURpc3RhbmNlcyBbRW5kXSA9IDA7CgkJd2hpbGUgKFF1ZXVlLmVtcHR5KCkgPT0gZmFsc2UpCgkJewoJCQlOb2RlIG5vZGUgPSBRdWV1ZS5mcm9udCgpOwoJCQlRdWV1ZS5wb3AoKTsKCQkJLy9jb3V0IDw8ICJQb3BwaW5nICIgCgkJCWlmIChub2RlLlggKyAxIDwgOCAmJiBub2RlLlkgKyAyIDwgOCkKCQkJCVVwZGF0ZSAobm9kZSwgTm9kZSAobm9kZS5YICsgMSwgbm9kZS5ZICsgMikpOwoJCQlpZiAobm9kZS5YICsgMiA8IDggJiYgbm9kZS5ZICsgMSA8IDgpCgkJCQlVcGRhdGUgKG5vZGUsIE5vZGUgKG5vZGUuWCArIDIsIG5vZGUuWSArIDEpKTsKCQkJaWYgKG5vZGUuWCArIDEgPCA4ICYmIG5vZGUuWSAtIDIgPj0gMCkKCQkJCVVwZGF0ZSAobm9kZSwgTm9kZSAobm9kZS5YICsgMSwgbm9kZS5ZIC0gMikpOwoJCQlpZiAobm9kZS5YICsgMiA8IDggJiYgbm9kZS5ZIC0gMSA+PSAwKQoJCQkJVXBkYXRlIChub2RlLCBOb2RlIChub2RlLlggKyAyLCBub2RlLlkgLSAxKSk7CgkJCWlmIChub2RlLlggLSAxID49IDAgJiYgbm9kZS5ZICsgMiA8IDgpCgkJCQlVcGRhdGUgKG5vZGUsIE5vZGUgKG5vZGUuWCAtIDEsIG5vZGUuWSArIDIpKTsKCQkJaWYgKG5vZGUuWCAtIDIgPj0gMCAmJiBub2RlLlkgKyAxIDwgOCkKCQkJCVVwZGF0ZSAobm9kZSwgTm9kZSAobm9kZS5YIC0gMiwgbm9kZS5ZICsgMSkpOwoJCQlpZiAobm9kZS5YIC0gMSA+PSAwICYmIG5vZGUuWSAtIDIgPj0gMCkKCQkJCVVwZGF0ZSAobm9kZSwgTm9kZSAobm9kZS5YIC0gMSwgbm9kZS5ZIC0gMikpOwoJCQlpZiAobm9kZS5YIC0gMiA+PSAwICYmIG5vZGUuWSAtIDEgPj0gMCkKCQkJCVVwZGF0ZSAobm9kZSwgTm9kZSAobm9kZS5YIC0gMiwgbm9kZS5ZIC0gMSkpOwoJCX0KCQljb3V0IDw8ICJUbyBnZXQgZnJvbSAiIDw8IHN0cjEgPDwgIiB0byAiIDw8IHN0cjIgPDwgIiB0YWtlcyAiIDw8IERpc3RhbmNlcyBbRW5kXSA8PCAiIGtuaWdodCBtb3Zlcy4iIDw8IGVuZGw7Cgl9CglyZXR1cm4gMDsKfQ==