简单搜索;
就是模拟象棋中马走"日"的,棋盘看做地图,搜索即可;
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define N 55
struct node{ //队列,广搜;(地图大小,地图走向,
int x,y,step; // 地图类型,地图初始点,目的,标记走过)
};
int map[N][N];
int dir[8][2]={1,-2, 2,-1, 2,1, 1,2, -1,2, -1,-2, -2,1, -2,-1};
int a='h'-'a'+1,b=9,sx,sy;
bool judge(int x,int y)
{
if(x>=0 && x<a && y>=1&& y<b && map[x][y]==0)
return 1;
return 0;
}
int bfs(int x,int y)
{
queue<node>q;
node cur,next;
int k;
cur.x=x;
cur.y=y;
cur.step=0;
q.push(cur);
map[x][y]=1;
while(!q.empty())
{
cur=q.front();
q.pop();
next.step=cur.step+1;
for(k=0;k<8;k++)
{
next.x=x=cur.x+dir[k][0];
next.y=y=cur.y+dir[k][1];
if(judge(x,y))
{
if(x==sx&&y==sy)
return next.step;
map[x][y]=1;
q.push(next);
}
}
}
return -1;
}
int main ()
{
int x,y,res;
char a[2][3];
while(scanf("%s%s",a[0],a[1])!=EOF)
{
memset(map,0,sizeof(map));
x=a[0][0]-'a';
y=a[0][1]-'0';
if(a[0][2]!='\0')
y=y*10+a[0][2]-'0';
sx=a[1][0]-'a';
sy=a[1][1]-'0';
if(a[1][2]!='\0')
sy=sy*10+a[1][2]-'0';
if(x==sx&&y==sy)
res=0;
else
res=bfs(x,y);
printf("To get from %s to %s takes %d knight moves.\n",a[0],a[1],res);
}
return 0;
}