HDU1372 Knight Moves

题目:HDU1372

 

题解:闲暇之余来巩固一下BFS...记得之前好像写了一个只能往右跳的棋盘问题,这个是八个方向都能跳。就像象棋中的“马”那样。

   所以用BFS往八个方向遍历就行

 

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<queue>
 4 #define maxn 10
 5 using namespace std;
 6 
 7 int x1,y1,x2,y2,dis[maxn][maxn];
 8 char c1,c2;
 9 bool f[maxn][maxn];
10 int way[]={-2,-2,-1,1,2,2,1,-1};
11 
12 void bfs(int x1,int y1,int x2,int y2)
13 {
14     int x,y,xx,yy;
15     queue<pair<int,int> > q;
16     q.push(pair<int,int>(x1,y1));
17     f[x1][y1]=false;
18     memset(f,true,sizeof(f));
19     memset(dis,0,sizeof(dis));
20 
21     while(!q.empty())
22     {
23         x=q.front().first;
24         y=q.front().second;
25         q.pop();
26         if(x==x2&&y==y2) break;
27 
28         for(int i=0;i<8;i++)
29         {
30             xx=x+way[i];yy=y+way[7-i];
31             if(xx>=1&&xx<=8&&yy>=1&&yy<=8&&f[xx][yy])
32             {
33                 q.push(pair<int,int>(xx,yy));
34                 f[xx][yy]=false;
35                 dis[xx][yy]=dis[x][y]+1;
36             }
37         }
38     }
39 }
40 
41 int main()
42 {
43     while(scanf("\n%c%d %c%d",&c1,&y1,&c2,&y2)!=EOF)
44     {
45         x1=c1-96;x2=c2-96;
46 
47 
48         bfs(x1,y1,x2,y2);
49 
50         printf("To get from %c%d to %c%d takes %d knight moves.\n",c1,y1,c2,y2,dis[x2][y2]);
51     }
52 
53     return 0;
54 }

 

posted on 2017-03-10 12:22  RocSAMA  阅读(94)  评论(0)    收藏  举报