/*This Code is Submitted by billforum for Problem 4000099 at 2012-01-27 15:36:46*/
#include <iostream>
#include <stdlib.h>
#include <queue>
using namespace std;
struct point
{
int x,y,f,step;
}data[10][10];
bool legal(int x,int y)
{
return (x<8&&x>=0&&y<8&&y>=0&&(data[y][x].f==0));
}
int main(int args,char** argv)
{
int dx[8]={-2,-2,-1,-1,1,1,2,2};
int dy[8]={-1,1,-2,2,-2,2,-1,1};
int total=0;
char cs,cf;
int xs,xf,ys,yf;
int ans;
while(cin>>cs>>xs>>cf>>xf)
{
ans=0;
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
{
data[i][j].x=j;
data[i][j].y=i;
data[i][j].f=0;
data[i][j].step=0;
}
ys=cs-'a';
yf=cf-'a';
xs=xs-1;
xf=xf-1;
queue<point> list;
point tmp;
data[ys][xs].f=1;
list.push(data[ys][xs]);
while(!list.empty())
{
tmp=list.front();
if(tmp.x==xf&&tmp.y==yf)
{
ans=tmp.step;
break;
}
for(int i=0;i<8;i++)
{
if(legal(tmp.x+dx[i],tmp.y+dy[i]))
{
data[tmp.y+dy[i]][tmp.x+dx[i]].f=1;
data[tmp.y+dy[i]][tmp.x+dx[i]].step=tmp.step+1;
list.push(data[tmp.y+dy[i]][tmp.x+dx[i]]);
}
}
list.pop();
}
cout<<"To get from "<<cs<<xs+1<<" to "<<cf<<xf+1<<" takes "<<ans<<" knight moves."<<endl;
}
//system("pause");
return 0;
}
http://acm.hit.edu.cn/hoj/problem/view?id=1440
简单的广搜