1
#include <iostream>2
#include <string>3
#include <queue>4
using namespace std;5

6
const int CHESS_SIZE = 8;7

8
struct Position9


{10
Position(int x, int y)11
: X(x), Y(y)12

{}13
int X;14
int Y;15

16
bool operator==(const Position & position) const17

{18
return X == position.X && Y == position.Y;19
}20
};21

22
struct23


{24
int x;25
int y;26
}dir[8] = 27


{28

{-2, 1},
{-1, 2},
{1, 2},
{2, 1},29

{2, -1},
{1, -2},
{-1, -2},
{-2, -1}30
};31

32
bool IsInside(const int x, const int y)33


{34
return x >= 0 && x < CHESS_SIZE && y >= 0 && y < CHESS_SIZE;35
}36

37
int _tmain(int argc, _TCHAR* argv[])38


{39
string start, end;40
while(cin >> start >> end)41

{42

int chess_count[CHESS_SIZE][CHESS_SIZE] =
{-1};43

bool chess_status[CHESS_SIZE][CHESS_SIZE] =
{false};44

45
int start_col = (int)(start[0] - 'a');46
int start_row = (int)(start[1] - '0' - 1);47
int end_col = (int)(end[0] - 'a');48
int end_row = (int)(end[1] - '0' - 1);49

50
queue<Position> q;51
q.push(Position(start_row, start_col));52
Position goal(end_row, end_col);53
chess_status[start_row][start_col] = true;54
chess_count[start_row][start_col] = 0;55

56
Position current_state(0,0), next_state(0,0);57

58
// if the start is equal to goal59
if(q.front() == goal)60

{61
cout << "To get from " << start << " to " << end << " takes 0 knight moves." << endl;62
continue;63
}64

65
bool isFind = false;66
Position new_position(0, 0);67

68
while(!q.empty())69

{70
current_state = q.front();71
q.pop();72

73
for(int i = 0; i < 8; ++i)74

{75
int x = current_state.X + dir[i].x;76
int y = current_state.Y + dir[i].y;77
new_position.X = x;78
new_position.Y = y;79

80
// for performance concern, when we found the solution, break it,81
// otherwise it will wait until all pre-solutions are being handled82
if(new_position == goal)83

{84
isFind = true;85
break;86
}87

88
if(IsInside(x, y) && !chess_status[x][y])89

{90
q.push(Position(x, y));91
chess_status[x][y] = true;92
chess_count[x][y] = chess_count[current_state.X][current_state.Y] + 1;93
}94
}95
if(isFind)96
break;97
}98

99
cout << "To get from " << start << " to " << end <<100
" takes " << chess_count[current_state.X][current_state.Y] + 1 << " knight moves." << endl;101
}102
return 0;103
}104

105



