其实手写模拟一个队列也挺简单的,尤其是熟练以后。
尼玛,这题欺负我不懂国际象棋,后来百度了下,国际象棋里骑士的走法就是中国象棋里面的马
所以搜索就有八个方向
对了注意初始化标记数组的时候,不要把起点标记为已走过。
因为测试数据里面有一组 f6 f6,此时样例输出的是0
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 }
代码君
HDU 1372 (搜索方向稍有改变) Knight Moves
时间: 2024-10-20 23:17:39