Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 9346 | Accepted: 5342 |
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.
直接简单BFS就可以过得题,练习下双向BFS
#include<cstdio> #include<cstring> using namespace std; typedef struct Node{ int x,y; int cent; }; Node queue[2][100]; int hash[2][10][10]; int BFS(Node &star,Node &end) { int base[2],top[2]; int flag=0,i,j,k,tmp; int cc[8][2]={1,2, 1,-2, -1,2, -1,-2, 2,1, 2,-1, -2,1, -2,-1}; if(star.x==end.x && star.y==end.y) return 0; star.cent=0; end.cent=0; base[0]=base[1]=top[0]=top[1]=0; queue[0][0]=star; queue[1][0]=end; memset(hash,-1,sizeof(hash));; hash[0][star.x][star.y]=0; hash[1][end.x][end.y]=0; while(base[flag]<=top[flag] || base[tmp]<=top[tmp]) { tmp=(flag+1)%2; if(base[flag]>top[flag]) { flag=tmp; continue; } for(i=0;i<8;i++) { int tmp_x=queue[flag][base[flag]].x+cc[i][0]; int tmp_y=queue[flag][base[flag]].y+cc[i][1]; if(tmp_x>0 && tmp_x<=8 && tmp_y>0 && tmp_y<=8 && hash[flag][tmp_x][tmp_y]==-1) { if(hash[tmp][tmp_x][tmp_y]!=-1) return queue[flag][base[flag]].cent+hash[tmp][tmp_x][tmp_y]+1; queue[flag][++top[flag]].x=tmp_x; queue[flag][top[flag]].y=tmp_y; queue[flag][top[flag]].cent=queue[flag][base[flag]].cent+1; hash[flag][tmp_x][tmp_y]=queue[flag][top[flag]].cent; } } base[flag]++; flag=tmp; } } int main() { int A,B; char a,b; Node star,end; while(scanf("%c%d %c%d",&a,&A,&b,&B)==4) { star.x=a-'a'+1; star.y=A; end.x=b-'a'+1; end.y=B; printf("To get from %c%d to %c%d takes %d knight moves.\n",a,A,b,B,BFS(star,end)); getchar(); } return 0; }