题目链接:http://poj.org/problem?id=2243
#include <stdio.h>
#include <math.h>
int knight[64][64];
void Floyed()
{
int i,j,k,x,y;
for(i=0;i<64;++i)
{
for(j=0;j<64;++j)
{//棋盘两格之间的相对位置
x=abs(i/8-j/8);
y=abs(i%8-j%8);
if(x==1&&y==2||x==2&&y==1)
knight[i][j]=knight[j][i]=1;
}
knight[i][i]=0;
}
for(k=0;k<64;++k)
{//棋盘任意两个之间的距离
for(i=0;i<64;++i)
for(j=0;j<64;++j)
if(knight[i][k]+knight[k][j]<knight[i][j])
knight[i][j]=knight[i][k]+knight[k][j];
}
}
int main()
{
char src[5],dist[5];
int x,y;
for(x=0;x<64;++x)
{
for(y=0;y<64;++y)
knight[x][y]=100;
}
Floyed();
while(scanf("%s %s",src,dist)!=EOF)
{
x=(src[0]-'a')*8+(src[1]-'1');
y=(dist[0]-'a')*8+(dist[1]-'1');
printf("To get from %s to %s takes %d knight moves.\n", src,dist,knight[x][y]);
}
return 0;
}