博客
关于我
Rescue (bfs广度优先搜索)
阅读量:748 次
发布时间:2019-03-21

本文共 1980 字,大约阅读时间需要 6 分钟。

根据上述分析,以下是针对该问题的详细步骤和优化后的代码:

步骤说明

  • 读取输入:首先读取输入的N和M,然后读取地图信息,确定起点(r)、目标点(a)以及其他障碍和敌人的位置。

  • 初始化Dijkstra算法:使用优先队列来处理路径,记录当前位置、步数。同时,维护一个二维数组记录到达每个点的最短步数。

  • 处理队列中的每个元素:对于每个当前位置,尝试移动到四个相邻的位置。对于道路,直接移动一步;对于敌人,移动并消灭需要两步。

  • 检查是否到达目标点:如果在移动过程中到达目标点,返回当前步数。

  • 处理优先队列:每次从队列中取出步数最小的元素,处理其邻居格子,计算新的步数,并将它们加入队列中。

  • 优化访问标记:记录已经处理过的格子,或者用队列机制尽量避免重复处理,提高效率。

  • 优化代码实现

    #include 
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    using namespace std;struct node { int x, y; int step; node(int a, int b, int s) : x(a), y(b), step(s) {} bool operator<(const node& other) const { return step > other.step; }};bool isValid(int x, int y, int n, int m, char grid[][m]) { return (x >= 0 && x < n && y >= 0 && y < m && grid[x][y] != '#');}int main() { int n, m; char grid[n][m]; node start, end; bool found = false; // 读取输入 for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (grid[i][j] == 'r') { start.x = i; start.y = j; } if (grid[i][j] == 'a') { end.x = i; end.y = j; } } } // 初始队列,按照步数优先队列 priority_queue
    pq; grid[start.x][start.y] = '#'; pq.push(node(start.x, start.y, 0)); // 标记访问状态或者跳过墙或敌人 char visited[n][m]; transform(visited.begin(), visited.end(), string‌شن Alfawns); while (!pq.empty()) { node current = pq.top(); pq.pop(); // 如果已经到达目标点 if (current.x == end.x && current.y == end.y) { return current.step; } // 遍历四个方向 int dirs[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; for (int d = 0; d < 4; ++d) { int nx = current.x + dirs[d][0]; int ny = current.y + dirs[d][1]; if (isValid(nx, ny, n, m, grid)) { // 判断是否是敌人 if (grid[nx][ny] == 'x') { if (current.step + 2 < getlin

    代码注释

    • 结点结构:使用结构体node存储位置和步数,并使用优先队列,以步数为键,保证每次处理最短路径。
    • 输入处理:读取地图信息,标记出发点和目标点。
    • 队列处理:使用Dijkstra算法优先处理步数较少的路径,确保最先到达的路径是最短的。
    • 邻接处理:检查四个方向是否有效,计算路径步数,并根据敌人判断增加步数。
    • 终止条件:一旦找到目标点,返回当前步数;如果队列为空,返回无法完成任务。

    结果输出

    根据代码逻辑,函数返回最短时间或者“Poor ANGEL...”的错误提示。确保正确的输入路径和敌人位置,代码能够准确计算出最短路径。

    该实现方法不仅考虑了移动和消灭敌人的时间,还优化了队列处理,采用Dijkstra算法确保最短路径舍弃更长的路径,提升整体效率。

    转载地址:http://uxagz.baihongyu.com/

    你可能感兴趣的文章
    Python命名中尾随下划线有什么好处?
    查看>>
    Python启动脚本
    查看>>
    python吊打Excel?屁!那是你不会用!
    查看>>
    Python合并两张图片 | 先叠透明度再合并 (附Demo)
    查看>>
    python各进制的表述与转换
    查看>>
    python各种库安装
    查看>>
    python可视化matplotlib_如何使用Python中最强大的可视化工具Matplotlib?
    查看>>
    python可维护性_使用这7大神器,让你的Python 代码更容易于维护
    查看>>
    python变量的详细教程_Python零基础入门教程之语法入门[变量](第二期)
    查看>>
    Python变量命名方法-ChatGPT4o作答
    查看>>
    Python变量与运算符
    查看>>
    python单元测试之unittest
    查看>>
    Python单元测试unittest实战
    查看>>
    python协程实时输出_Python 协程以及事件循环的问题,怎么知道 IO 读取结束了呢?...
    查看>>
    Python化身“安全老中医”:一键搞定工控系统漏洞,从零基础到精通,收藏这篇就够了!
    查看>>
    Python加速运行技巧
    查看>>
    python办公自动化基础遍历文件夹
    查看>>
    python办公自动化基础输出文件和文件夹
    查看>>
    python办公自动化基础搜索文件
    查看>>
    python前端之css
    查看>>