Of course you know that it is vice versa. So you offer him to write a program that solves the "difficult" part.
Your job is to write a program that takes two squares a and b as input and then determines the number of knight moves on a shortest route from a to b.
InputThe input file will contain one or more test cases. Each test case consists of one line containing two squares separated by one space. A square is a string consisting of a letter (a-h) representing the column and a digit (1-8) representing the row on the chessboard.
OutputFor each test case, print one line saying "To get from xx to yy takes n knight moves.".
Sample Inpute2 e4a1 b2b2 c3a1 h8a1 h7h8 a1b1 c3f6 f6
Sample OutputTo 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;}