hdu 1372 骑士从起点走到终点的步数 (BFS)

给出起点和终点 求骑士从起点走到终点所需要的步数

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.

 

 

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <queue>
 5 using namespace std;
 6 
 7 
 8 int map[15][15];
 9 int sx, sy;
10 int ex, ey;
11 bool flag;
12 char s1[5] , s2[5] ;
13 
14 int dx[] = {-2,-1,1,2,-2,-1,1,2} ;
15 int dy[] = {1,2,2,1,-1,-2,-2,-1} ;
16 
17 struct node
18 {
19     int x , y , step ;
20 };
21 
22 int bfs()
23 {
24     queue<node> q ;
25     int i , fx ,fy ;
26     node now , t ;
27     now.x = sx ;
28     now.y = sy ;
29     now.step = 0 ;
30     q.push(now) ;
31     memset(map , 0 , sizeof(map)) ;
32     map[sx][sy] = 1 ;
33     while(!q.empty())
34     {
35         now = q.front() ;
36         q.pop() ;
37         for (i = 0 ; i < 8 ; i++)
38         {
39             fx = now.x + dx[i] ;
40             fy = now.y + dy[i] ;
41             if (fx<0 || fy<0 || fx>= 8 || fy>= 8 || map[fx][fy] == 1)
42                 continue ;
43             if (fx == ex && fy == ey)
44             {
45                 return now.step+1 ;
46             }
47             t.x = fx ;
48             t.y = fy ;
49             t.step = now.step+1 ;
50             q.push(t) ;
51             map[fx][fy] = 1 ;
52         }
53     }
54     return 0 ;
55 }
56 
57 
58 
59 int main()
60 {
61     //freopen("in.txt","r",stdin) ;
62     while (scanf("%s %s" , &s1 , &s2) !=EOF)
63     {
64         sx = s1[0] - 'a' ;
65         sy = s1[1] - '1' ;
66         ex = s2[0] - 'a' ;
67         ey = s2[1] - '1' ;
68         printf("To get from %s to %s takes %d knight moves.\n",s1,s2,bfs()) ;
69     }
70 
71 
72 
73     return 0 ;
74 }
View Code

 

转载于:https://www.cnblogs.com/mengchunchen/p/4515370.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值