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 }

 

posted on 2013-06-05 17:05  行者1992  阅读(203)  评论(0编辑  收藏  举报