Description
Input
Output
Sample Input
e2 e4 a1 b2 b2 c3 a1 h8 a1 h7 h8 a1 b1 c3 f6 f6
Sample Output
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.
又是STL ,用到了队列,其实就是一个模板,但是这个真的很重要,需要我去耐心掌握
用一个数组区存储它的八个方向,去一个一个判断它的运动情况,找到最优解
以后尽量先把它的坐标变化写出来,然后再去判断是否到达边界,可能会方便的多
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
#include<stdio.h> #include<queue> #include<string.h> using namespace std; int s[8][2]= {-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2,-2,-1}; int m[10][10],x1,y1; 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||m[x][y]) return 1; return 0; } int BFS() { queue<node> q; node p,n,k; p.x=s1[0]-'a'; p.y=s1[1]-'1'; p.step=0; x1=s2[0]-'a'; y1=s2[1]-'1'; memset(m,0,sizeof(m)); m[p.x][p.y]=1; q.push(p); while(!q.empty()) { k=q.front(); q.pop(); if(k.x==x1&&k.y==y1) return k.step; for(int i=0; i<8; i++) { n.x=k.x+s[i][0]; n.y=k.y+s[i][1]; if(n.x==x1&&n.y==y1) return k.step+1; if(check(n.x,n.y)) continue; n.step=k.step+1; m[n.x][n.y]=1; q.push(n); } } return 0; } int main() { while(scanf("%s%s",s1,s2)!=EOF) printf("To get from %s to %s takes %d knight moves.\n",s1,s2,BFS()); return 0; }