#include<bits/stdc++.h>
using namespace std;
#define io {ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);}
const int INF= 1 << 30 ;
int stp[ 8 ] [ 8 ] ;
int dx[ 8 ] = { - 2 ,- 2 ,- 1 ,- 1 , 1 , 1 , 2 , 2 } ;
int dy[ 8 ] = { - 1 , 1 ,- 2 , 2 ,- 2 , 2 ,- 1 , 1 } ;
struct NODE{
int x, y;
NODE( int x= 0 ,int y= 0 ) : x( x) ,y( y) { } ;
bool InRange( ) {
return 0 <= x and x< 8 and 0 <= y and y< 8 ; }
} nxt, now;
int main( ) {
io
string s, e;
// input
while ( cin >> s>> e ) {
NODE S= NODE( s[ 0 ] - 'a' ,s[ 1 ] - '1' ) ;
NODE E= NODE( e[ 0 ] - 'a' ,e[ 1 ] - '1' ) ;
for ( int x= 0 ; x< 8 ; x++ )
for ( int y= 0 ; y< 8 ; y++ )
stp[ x] [ y] = INF;
deque< NODE> Q= { S} ;
stp[ S.x ] [ S.y ] = 0 ;
while ( ! Q.empty ( ) ) {
now= Q.front ( ) ;
Q.pop_front ( ) ;
for ( int i= 0 ; i< 8 ; i++ ) {
nxt= NODE( now.x + dx[ i] ,now.y + dy[ i] ) ;
if ( nxt.InRange ( ) and stp[ nxt.x ] [ nxt.y ] == INF ) {
stp[ nxt.x ] [ nxt.y ] = stp[ now.x ] [ now.y ] + 1 ;
Q.push_back ( nxt) ;
}
}
}
// output
cout << "To get from " << s<< " to " << e<< " takes " << stp[ E.x ] [ E.y ] << " knight moves.\n " ;
}
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBpbyB7aW9zOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoMCk7IGNvdXQudGllKDApO30KCmNvbnN0IGludCBJTkY9MTw8MzA7CiBpbnQgc3RwWzhdWzhdOwppbnQgZHhbOF09ey0yLC0yLC0xLC0xLCAxLCAxLCAyLCAyfTsKaW50IGR5WzhdPXstMSwgMSwtMiwgMiwtMiwgMiwtMSwgMX07CgpzdHJ1Y3QgTk9ERXsKCWludCB4LCB5OwoJTk9ERShpbnQgeD0wLGludCB5PTApOngoeCkseSh5KXt9OwoJYm9vbCBJblJhbmdlKCl7CgkJcmV0dXJuIDA8PXggYW5kIHg8OCBhbmQgMDw9eSBhbmQgeTw4OyB9Cn0gbnh0LCBub3c7CgppbnQgbWFpbigpewoJaW8KCXN0cmluZyBzLCBlOwoJLy8gaW5wdXQKCXdoaWxlKCBjaW4+PnM+PmUgKXsKCQlOT0RFIFM9Tk9ERShzWzBdLSdhJyxzWzFdLScxJyk7CgkJTk9ERSBFPU5PREUoZVswXS0nYScsZVsxXS0nMScpOwoJCQoJCWZvcihpbnQgeD0wOyB4PDg7IHgrKykKCQkJZm9yKGludCB5PTA7IHk8ODsgeSsrKQoJCQkJc3RwW3hdW3ldPUlORjsKCQlkZXF1ZTxOT0RFPiBRPXtTfTsKCQlzdHBbUy54XVtTLnldPTA7CgkJd2hpbGUoICFRLmVtcHR5KCkgKXsKCQkJbm93PVEuZnJvbnQoKTsKCQkJUS5wb3BfZnJvbnQoKTsKCQkJZm9yKGludCBpPTA7IGk8ODsgaSsrKXsKCQkJCW54dD1OT0RFKG5vdy54K2R4W2ldLG5vdy55K2R5W2ldKTsKCQkJCWlmKCBueHQuSW5SYW5nZSgpIGFuZCBzdHBbbnh0LnhdW254dC55XT09SU5GICl7CgkJCQkJc3RwW254dC54XVtueHQueV09c3RwW25vdy54XVtub3cueV0rMTsKCQkJCQlRLnB1c2hfYmFjayhueHQpOwoJCQkJfQoJCQl9CgkJfQoJCS8vIG91dHB1dAoJCWNvdXQ8PCJUbyBnZXQgZnJvbSAiPDxzPDwiIHRvICI8PGU8PCIgdGFrZXMgIjw8c3RwW0UueF1bRS55XTw8IiBrbmlnaHQgbW92ZXMuXG4iOwoJfQp9