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到达草的最少跳跃次数。

    上一篇:Unity Shader之路(五前置知识点)Unity提供的Cg/HLSL语义?
    下一篇:Unity Shader之路(五)创建第一个顶点/片元着色器?

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年03月25日 09时19分32秒