题目大意:在一张8×8的国际象棋棋盘上(其中纵坐标用a-h表示,横坐标用1-8表示),给你一枚骑士的起点坐标和要到达的终点坐标,让你求出骑士要走的最小步数。
分析:其实这道题的难点就在于很多人并不知道骑士是怎么移动的,其实国际象棋中的其实相当于中国象棋中的马,他的移动轨迹的“日”字形的,只是少了中国象棋中的“蹩马腿”这一说。知道了这一点,这道题就简单多了,很水的一道BFS题目。
实现代码如下:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
bool s[10][10];
int dir[8][2]={{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}};
typedef struct node
{
int x,y,tmp;
}point;
point que[100];
int sx,sy,ex,ey;
void bfs()
{
int cmp1=1,cmp2=1;
int x,y;
que[cmp1].x=sx;
que[cmp1].y=sy;
que[cmp1].tmp=0;
s[sx][sy]=true;
while(cmp1<=cmp2&&!s[ex][ey])
{
for(int i=0;i<8;i++)
{
x=que[cmp1].x+dir[i][0];
y=que[cmp1].y+dir[i][1];
if(x<=8&&x>0&&y<=8&&y>0&&!s[x][y])
{
cmp2++;
que[cmp2].x=x;
que[cmp2].y=y;
que[cmp2].tmp=que[cmp1].tmp+1;
s[x][y]=true;
}
}
cmp1++;
}
printf("%d knight moves.\n",que[cmp2].tmp);
}
int main()
{
char a,b;
int c,d;
while(cin>>a>>c>>b>>d)
{
memset(s,false,sizeof(s));
sx=a-'a'+1;
sy=c;
ex=b-'a'+1;
ey=d;
printf("To get from %c%d to %c%d takes ",a,c,b,d);
bfs();
}
return 0;
}