首页 > 代码库 > HDU 1372 (搜索方向稍有改变) Knight Moves
HDU 1372 (搜索方向稍有改变) Knight Moves
其实手写模拟一个队列也挺简单的,尤其是熟练以后。
尼玛,这题欺负我不懂国际象棋,后来百度了下,国际象棋里骑士的走法就是中国象棋里面的马
所以搜索就有八个方向
对了注意初始化标记数组的时候,不要把起点标记为已走过。
因为测试数据里面有一组 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 LOCAL56 freopen("1372in.txt", "r", stdin);57 #endif58 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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。