题目大意:在一张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; }