//典型的BFS(广度优先搜索) //马走日所需最少步数问题 #include<iostream> using namespace std; int map[8][8];//记录步数数组 int vis[8][8];//访问过的记录数组 char a[3],b[3]; int x1,y1,x2,y2; void set(int x1,int y1) { //剪去不合理范围 if(x1+1 <= 7 && y1+2 <= 7 && !vis[x1+1][y1+2]) map[x1+1][y1+2] = map[x1][y1]+1; if(x1+1 <= 7 && y1-2 >= 0 && !vis[x1+1][y1-2]) map[x1+1][y1-2] = map[x1][y1]+1; if(x1-1 >= 0 && y1+2 <= 7 && !vis[x1-1][y1+2]) map[x1-1][y1+2] = map[x1][y1]+1; if(x1-1 >= 0 && y1-2 >= 0 && !vis[x1-1][y1-2]) map[x1-1][y1-2] = map[x1][y1]+1; if(x1+2 <= 7 && y1+1 <= 7 && !vis[x1+2][y1+1]) map[x1+2][y1+1] = map[x1][y1]+1; if(x1-2 >= 0 && y1+1 <= 7 && !vis[x1-2][y1+1]) map[x1-2][y1+1] = map[x1][y1]+1; if(x1+2 <= 7 && y1-1 >= 0 && !vis[x1+2][y1-1]) map[x1+2][y1-1] = map[x1][y1]+1; if(x1-2 >= 0 && y1-1 >= 0 && !vis[x1-2][y1-1]) map[x1-2][y1-1] = map[x1][y1]+1; } void search(int x1,int y1,int x2,int y2) { int step = 1; vis[x1][y1] = 1; set(x1,y1); //广度优先搜索过程 while(map[x2][y2] == 0) { for(int i = 0;i < 8;++i) for(int j = 0;j < 8;++j) if(map[i][j] == step) { vis[i][j] = 1; set(i,j); } ++step; } } int main() { while(cin >> a >> b) { memset(map,0,sizeof(map));//初始化 memset(vis,0,sizeof(vis));//初始化 x1 = a[0] - 'a'; y1 = a[1] - '1'; x2 = b[0] - 'a'; y2 = b[1] - '1'; if(strcmp(a,b) == 0) cout << "To get from "<< a <<" to "<< b << " takes 0 knight moves." <<endl; else { search(x1,y1,x2,y2); cout << "To get from "<< a <<" to "<< b << " takes "<< map[x2][y2] <<" knight moves." << endl; } } return 0; }