HDU 1372 Knight Moves
http://acm.hdu.edu.cn/showproblem.php?pid=1372
大意:骑士“日”字形移动,从初始点移动到终点所需要的最少步子数,广搜
1 /* 2 结构体加广搜可读性更好 3 用数组单独实现也可以,易出错,可读性也不好 4 数组实现的思路是:每个ans[]元素所走的步子数为 5 扩展出这个点的步子数加1 ans[h++]=ans[t-1]+1; 6 */ 7 8 #include <iostream> 9 #include <stdio.h> 10 #include <string.h> 11 #include <math.h> 12 using namespace std; 13 int qx[70],qy[70],ans[70]; 14 int vis[10][10]; 15 int dir[8][2]={{2,1},{2,-1},{-2,1},{-2,-1},{1,2},{1,-2},{-1,2},{-1,-2}}; 16 int bfs(int x1,int y1,int x2,int y2) 17 { 18 memset(vis,0,sizeof(vis)); 19 int h=0,t=0; 20 qx[h]=x1;qy[h++]=y1; 21 ans[0]=0; 22 vis[x1][y1]=1; 23 int px,py,nx,ny; 24 while(t<h) 25 { 26 px=qx[t]; 27 py=qy[t++]; 28 if(px==x2&&py==y2) 29 return ans[t-1];//t已经自加,应为自加前的数据 30 for(int i=0;i<8;i++) 31 { 32 nx=px+dir[i][0]; 33 ny=py+dir[i][1]; 34 if(nx>8||nx<1||ny>8||ny<1||vis[nx][ny]) 35 continue; 36 qx[h]=nx,qy[h]=ny; 37 ans[h++]=ans[t-1]+1; 38 vis[nx][ny]=1; 39 } 40 } 41 } 42 int main() 43 { 44 int x1,y1,x2,y2; 45 char str[3][5]; 46 while(scanf("%s%s",str[0],str[1])!=EOF) 47 { 48 x1=str[0][0]-'a'+1; 49 y1=str[0][1]-'1'+1; 50 x2=str[1][0]-'a'+1; 51 y2=str[1][1]-'1'+1; 52 //printf("%d %d %d %d\n",x1,y1,x2,y2); 53 int ans=bfs(x1,y1,x2,y2); 54 printf("To get from %s to %s takes %d knight moves.\n",str[0],str[1],ans); 55 56 } 57 return 0; 58 }