
188. 武士风度的牛 C++ bfs(宽度优先搜索)
发布日期:2021-05-08 02:33:19
浏览次数:19
分类:精选文章
本文共 1868 字,大约阅读时间需要 6 分钟。
为了解决这个问题,我们需要找到The Knight从其起始位置到达草的位置所需的最少跳跃次数。这个问题可以通过广度优先搜索(BFS)来解决,因为BFS适用于在等距离的情况下找到最短路径的问题。
方法思路
问题分析:The Knight可以像马一样跳八个方向,每次跳跃的位置可以看作国际象棋中的马的走法。我们的任务是找到从起始位置到达草的位置的最少跳跃次数。
输入处理:读取输入数据,确定牧场的列数和行数。然后读取地图数据,找到The Knight的起始位置和草的位置。
BFS算法:使用BFS来探索每一个可能的跳跃位置,记录访问状态以避免重复。队列用于处理每一个位置,并记录跳跃次数。当找到草的位置时,返回当前跳跃次数。
跳跃方向:The Knight有八个可能的跳跃方向,这些方向通过dx和dy数组表示。
解决代码
#include#include #include using namespace std;int bfs(int gx, int gy, int ga, int gb, const vector >& g, int m, int n, vector >& dist) { dist[gx][gy] = 0; queue > q; q.push({gx, gy}); vector > dirs = { {-1, -2}, {-2, -1}, {-2, 1}, {-1, 2}, {1, 2}, {2, 1}, {2, -1}, {1, -2} }; while (!q.empty()) { auto curr = q.front(); q.pop(); for (const auto& dir : dirs) { int nx = curr.first + dir.first; int ny = curr.second + dir.second; // 检查是否越界 if (nx >= 0 && nx < m && ny >= 0 && ny < n) { // 检查是否是障碍物或已访问过 if (g[nx][ny] != '*' && dist[nx][ny] == -1) { dist[nx][ny] = dist[curr.first][curr.second] + 1; if (nx == ga && ny == gb) { return dist[nx][ny]; } q.push({nx, ny}); } } } } return -1; // 题目保证有解,所以这里不需要处理无解的情况}int main() { int m, n; scanf("%d %d", &m, &n); vector > g(n, vector (m)); for (int i = 0; i < n; ++i) { char line[m]; scanf("%s", line); for (int j = 0; j < m; ++j) { g[i][j] = line[j]; } } int gx, gy, ga, gb; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (g[i][j] == 'K') { gx = j; // x坐标 gy = i; // y坐标 } else if (g[i][j] == 'H') { ga = j; gb = i; } } } vector > dist(n, vector (m, -1)); int steps = bfs(gx, gy, ga, gb, g, m, n, dist); cout << steps << endl;}
代码解释
读取输入:首先读取列数和行数,然后读取地图数据,找到The Knight的起始位置和草的位置。
BFS初始化:将起始位置加入队列,并初始化距离数组,起始位置的距离为0。
处理跳跃方向:定义八个可能的跳跃方向,遍历每一个方向的位置。
检查位置有效性:确保新位置在牧场范围内,且不是障碍物或已访问过。
更新距离和队列:如果新位置是草的位置,返回当前距离加1;否则,将新位置加入队列,并记录距离。
通过这种方法,我们可以高效地找到The Knight到达草的最少跳跃次数。
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年03月25日 09时19分32秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
JDK 内置的多线程协作工具类的使用场景
2019-03-05
Java 中哪些对象可以获取类对象
2019-03-05
linux 的 cp 命令如何复制不提示覆盖
2019-03-05
缓存穿透 / 缓存击穿 / 缓存雪崩 / 缓存一致性
2019-03-05
linux 的 sleep 命令
2019-03-05
js 的 let var const 区别
2019-03-05
vue计算属性和监听器区别
2019-03-05
11.2.6 时间值的小数秒
2019-03-05
11.2.7 日期和时间类型之间的转换
2019-03-05
redis 内存溢出_从数据存储的角度告诉你Redis为什么这么快!
2019-03-05
实例分析Facebook激励视频广告接入
2019-03-05
实例:使用OKGO下载网络压缩包资源,然后解压缩放在本地使用
2019-03-05
解决mybatis嵌套查询使用PageHelper分页不准确
2019-03-05
Redis源码分析(七)--- zipmap压缩图
2019-03-05
大规模集群自动化部署工具--Chef的安装部署
2019-03-05
HDFS源码分析(六)-----租约
2019-03-05
自定义Hive Sql Job分析工具
2019-03-05
聊聊HDFS RBF第二阶段的主要改进
2019-03-05
【MySQL】(九)触发器
2019-03-05
关于Altium Designer 09导出BOM表不能正确分类问题
2019-03-05