当年的难题,现在用队列是如此的容易;
不多说;
#include"stdio.h"
#include"string.h"
int visit[10][10];
int dir[8][2]={-2,1, -1,2, 2,1, 1,2, 2,-1, 1,-2, -2,-1, -1,-2};
int sx,sy,ex,ey;
#include"queue"
using namespace std;
struct point
{
int x,y;
int step;
};
int judge(int x,int y)
{
if(x>=1&&x<=8&&y>=1&&y<=8)
return 1;
return 0;
}
int bfs(int x,int y)
{
int i;
memset(visit,0,sizeof(visit));
queue<point>q;
point cur,next;
cur.x=x;cur.y=y;
cur.step=0;
q.push(cur);
visit[x][y]=1;
while(!q.empty())
{
next=q.front();
q.pop();
if(next.x==ex&&next.y==ey)
return next.step;
for(i=0;i<8;i++)
{
x=next.x+dir[i][0];
y=next.y+dir[i][1];
if(visit[x][y]==0&&judge(x,y))
{
visit[x][y]=1;
cur.x=x;
cur.y=y;
cur.step=next.step+1;
q.push(cur);
}
}
}
return -1;
}
int main()
{
char a[10],b[10];
while(scanf("%s%s",a,b)!=EOF)
{
sx=a[0]-'a'+1;
sy=a[1]-'0';
ex=b[0]-'a'+1;
ey=b[1]-'0';
printf("To get from %s to %s takes %d knight moves.\n",a,b,bfs(sx,sy));
}
return 0;
}