e2 e4 a1 b2 b2 c3 a1 h8 a1 h7 h8 a1 b1 c3 f6 f6
To get from e2 to e4 takes 2 knight moves. To get from a1 to b2 takes 4 knight moves. To get from b2 to c3 takes 2 knight moves. To get from a1 to h8 takes 6 knight moves. To get from a1 to h7 takes 5 knight moves. To get from h8 to a1 takes 6 knight moves. To get from b1 to c3 takes 1 knight moves. To get from f6 to f6 takes 0 knight moves.
题意:给出骑士的骑士位置和目标位置,计算骑士要走多少步
思路:首先要做这道题必须要理解国际象棋中骑士的走法,国际象棋中,骑士是在一个3*2的格子中进行对角线移动,通过画图很容易就知道骑士最多可以朝八个方向移动,那么就朝8个方向进行BFS即可
#include <stdio.h> #include <string.h> #include <queue> using namespace std; int step; int to[8][2] = {-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2,-2,-1};//骑士移动的8个方位 int map[10][10],ex,ey; char s1[5],s2[5]; struct node { int x,y,step; }; int check(int x,int y) { if(x<0 || y<0 || x>=8 || y>=8 || map[x][y]) return 1; return 0; } int bfs() { int i; queue<node> Q; node p,next,q; p.x = s1[0]-'a'; p.y = s1[1]-'1'; p.step = 0; ex = s2[0]-'a'; ey = s2[1]-'1'; memset(map,0,sizeof(map)); map[p.x][p.y] = 1; Q.push(p); while(!Q.empty()) { q = Q.front(); Q.pop(); if(q.x == ex && q.y == ey) return q.step; for(i = 0;i<8;i++) { next.x = q.x+to[i][0]; next.y = q.y+to[i][1]; if(next.x == ex && next.y == ey) return q.step+1; if(check(next.x,next.y)) continue; next.step = q.step+1; map[next.x][next.y] = 1; Q.push(next); } } return 0; } int main() { while(~scanf("%s%s",s1,s2)) { printf("To get from %s to %s takes %d knight moves.\n",s1,s2,bfs()); } return 0; }