http://acm.hdu.edu.cn/showproblem.php?pid=1372
#include <queue>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct node{
int x,y;
void init(int nx, int ny){
x = nx;
y = ny;
}
};
char str1[10],str2[10];
int dis[10][10],vis[10][10];
int x1,y1,x2,y2;
int dir[][2] = {{-2,-1},{-1,-2},{1,-2},{2,-1},{2,1},{1,2},{-1,2},{-2,1}};
bool Isin(int x, int y){
if(x < 1 || x > 8 || y < 1 || y > 8) return false;
return true;
}
int bfs(int x, int y){
queue <node> q;
while(!q.empty())
q.pop();
node a,b;
a.init(x,y);
vis[a.x][a.y] = 1;
q.push(a);
while(!q.empty()){
a = q.front();
q.pop();
if(a.x == x2 && a.y == y2) return 1;
for(int i=0; i<8; i++){
int xx = a.x + dir[i][0],yy = a.y + dir[i][1];
b.init(xx, yy);
if(!vis[xx][yy] && Isin(xx, yy)){
vis[xx][yy] = 1;
dis[xx][yy] = dis[a.x][a.y] + 1;
q.push(b);
}
}
}
return 0;
}
int main(){
// freopen("in.txt", "r", stdin);
while(scanf("%s%s", str1, str2) != EOF){
x1 = str1[0] - 'a' + 1, x2 = str2[0] - 'a' + 1;
y1 = str1[1] - '0', y2 = str2[1] - '0';
memset(vis, 0, sizeof(vis));
memset(dis, 0, sizeof(dis));
if(bfs(x1, y1)) printf("To get from %s to %s takes %d knight moves.\n",str1, str2, dis[x2][y2]);
}
return 0;
}