Description
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.
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.
题意:骑士走法是日字型,或说L型,给出起点和终点,求起点到终点的最少步数
分析:广搜(bfs)
#include<stdio.h> #include<string.h> int vis[10][10]; int fx[8]= {1,1,-1,-1,2,2,-2,-2}, fy[8]= {2,-2,2,-2,1,-1,1,-1}; struct node { int x,y,step; bool operator == (const node b) { return x==b.x&&y==b.y; } bool ok() { return x<8&&x>=0&&y<8&&y>=0&&vis[x][y]==0; } } fr,en,que[1000]; int bfs() { if(fr==en)return 0; int coun=0,top=1; memset(que,0,sizeof(que)); memset(vis,0,sizeof(vis)); que[++coun]=fr; while(top<=coun) { node d=que[top]; top++; node p; for(int i=0; i<8; i++) { p.x=d.x+fx[i]; p.y=d.y+fy[i]; p.step=d.step+1; if(p.ok()) { if(p==en)return p.step; vis[d.x][d.y]=1; que[++coun]=p; } } } } int main() { int fry,eny; char frx,enx; while(~scanf("%c%d %c%d",&frx,&fry,&enx,&eny)) { fr.x=frx-'a'; fr.y=fry-1; en.x=enx-'a'; en.y=eny-1; printf("To get from %c%d to %c%d takes %d knight moves.\n",frx,fry,enx,eny,bfs()); getchar(); } return 0; }
┆凉┆暖┆降┆等┆幸┆我┆我┆里┆将┆ ┆可┆有┆谦┆戮┆那┆ ┆大┆始┆ ┆然┆
┆薄┆一┆临┆你┆的┆还┆没┆ ┆来┆ ┆是┆来┆逊┆没┆些┆ ┆雁┆终┆ ┆而┆
┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆没┆ ┆你┆
┆ ┆这┆ ┆试┆方┆在┆逃┆ ┆会┆ ┆在┆ ┆清┆来┆准┆ ┆没┆有┆ ┆没┆
┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆这┆ ┆晨┆ ┆的┆ ┆有┆来┆ ┆有┆
┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆这┆ ┆里┆ ┆没┆ ┆杀┆ ┆来┆ ┆ ┆来┆