题目
- 参考网址:https://vjudge.net/problem/UVA-439
- 大意:
按照国际象棋🐴的移动规则,求🐴最小需要多少步从起点跳到终点。(老BFS模板题了~)
知识点
- BFS求最短路径
思路
BFS模板题,输入转换为坐标r (row),c (column)行和列,使用队列的方式进行BFS,使用vis记录是否访问,使用dis记录距离(当然两个可以合并为一个来写)。
- 每次pop出队首u检查是否是目的位置,是的话返回当前节点位置所记录下的dis。
- 否则,向“四面八方”扩散出去,判断条件为即不超出边界,且没有访问过 (is_ok(r1, c1) && !vis[r1][c1])。(访问过再走一边相当于绕圈子了,肯定不是最短路径)如果满足条件,将该状态所在的位置的dis更新为dis[u] + 1(距离+1),vis[当前位置]打上标记然后入队,每次循环检查队列是否为空,如果队列为空,仍然没有找到目的位置,则说明无解(当然这道题是不可能有无解的)。
- 状态的记录建议用个结构体,我用了数组记录,debug了半天,问题在后续有记录!!
代码
# include <iostream>
# include <queue>
using namespace std;
string alphabet = "abcdefg"; // 用于映射 0-7
int end_r, end_c; // 结束坐标
int dr[] = {
1, 2, 2, 1, -1, -2, -2, -1}; // 顺时针
int dc[] = {
-2, -1, 1, 2, 2, 1, -1, -2};
int vis[8][8], dis[8]