其实手写模拟一个队列也挺简单的,尤其是熟练以后。

尼玛,这题欺负我不懂国际象棋,后来百度了下,国际象棋里骑士的走法就是中国象棋里面的马

所以搜索就有八个方向

对了注意初始化标记数组的时候,不要把起点标记为已走过。

因为测试数据里面有一组 f6 f6,此时样例输出的是0

 

HDU 1372 (搜索方向稍有改变) Knight Moves_百度HDU 1372 (搜索方向稍有改变) Knight Moves_#ifdef_02
 1 //#define LOCAL
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 struct Point
 8 {
 9     int x, y;
10     int steps;
11 }start, end, qu[100];
12 
13 int vis[8][8];
14 int dir[8][2] = {{1, 2}, {-1, 2}, {1, -2}, {-1, -2}, {2, 1}, {-2, 1}, {2, -1}, {-2, -1}};
15 char col1, col2;
16 int row1, row2;
17 int head, tail;
18 
19 bool islegal(int x, int y)
20 {
21     return (x>=0 && x<8 && y>=0 && y<8 && (!vis[x][y]));
22 }
23 
24 void BFS(void)
25 {
26     head = 0, tail = 1;
27     qu[0].x = start.x;
28     qu[0].y = start.y;
29     qu[0].steps = 0;
30     while(head < tail)
31     {
32         if(qu[head].x == end.x && qu[head].y == end.y)
33         {
34             printf("To get from %c%d to %c%d takes %d knight moves.\n", col1, row1, col2, row2, qu[head].steps);
35             return;
36         }
37         for(int i = 0; i < 8; ++i)
38         {
39             int xx = qu[head].x + dir[i][0];
40             int yy = qu[head].y + dir[i][1];
41             if(islegal(xx, yy))
42             {
43                 qu[tail].x = xx;
44                 qu[tail].y = yy;
45                 qu[tail++].steps = qu[head].steps + 1;
46                 vis[xx][yy] = 1;
47             }
48         }
49         ++head;
50     }
51 }
52 
53 int main(void)
54 {
55     #ifdef LOCAL
56         freopen("1372in.txt", "r", stdin);
57     #endif
58 
59     while(cin >> col1 >> row1 >> col2 >> row2)
60     {
61         start.x = row1 - 1, start.y = col1 - 'a';
62         end.x = row2 - 1, end.y = col2 - 'a';
63         memset(vis, 0, sizeof(vis));
64         BFS();
65     }
66     return 0;
67 }
代码君