当前位置:首页 > 洛谷 > 洛谷P1443题解:BFS算法求解马的移动问题

洛谷P1443题解:BFS算法求解马的移动问题

1天前

洛谷P1443题解:BFS算法求解马的移动问题 洛谷题解 广度优先搜索 广搜 BFS算法 队列 第1张

一、题目解读

洛谷P1443题要求计算在n×m的棋盘上,马从起点(x, y)出发,到达每个位置所需的最少移动步数。题目中“马”遵循国际象棋的移动规则(即走“日”字),需输出整个棋盘各点到起点的最短步数矩阵。该问题本质是求解多源最短路径,但考虑到马的移动特性,采用广度优先搜索BFS算法能高效解决。

二、解题思路

核心思路为:

1. BFS算法:利用队列存储待遍历的位置,从起点开始逐层扩散,确保首次到达某点的步数即为最短。

2. 方向数组优化:预先定义马可移动的8个方向(dx, dy),避免每次计算偏移量,提升效率。

3. 标记已访问:使用board数组记录步数,初始值-1表示未访问,避免重复计算。

4. 边界检查:在扩展新位置时,需判断是否在棋盘内且未被访问,保证算法正确性。

三、解题步骤

1. 初始化:读取棋盘尺寸n×m和起点坐标(x, y),创建board数组并初始化为-1,队列q存入起点。

2. BFS主循环:

    弹出队首位置,获取其坐标和步数。

    遍历8个方向,计算新坐标(nx, ny)。

    若新位置合法且未访问,更新board[nx][ny]为当前步数+1,并加入队列。

3. 输出结果:遍历board数组,按格式输出每个位置的步数。

四、代码与注释

#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;

// 定义马移动的8个方向
const int dx[8] = {1, 2, 2, 1, -1, -2, -2, -1};
const int dy[8] = {2, 1, -1, -2, -2, -1, 1, 2};

int main() {
    int n, m, x, y;
    cin >> n >> m >> x >> y;
    
    // 初始化棋盘,所有位置设为-1
    vector<vector<int>> board(n+1, vector<int>(m+1, -1));
    queue<pair<int, int>> q;
    
    // 起点设置为0步
    board[x][y] = 0;
    q.push({x, y});
    
    while (!q.empty()) {
        auto current = q.front();
        q.pop();
        int cx = current.first;
        int cy = current.second;
        
        // 尝试8个方向
        for (int i = 0; i < 8; i++) {
            int nx = cx + dx[i];
            int ny = cy + dy[i];
            
            // 检查新位置是否在棋盘内且未被访问
            if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && board[nx][ny] == -1) {
                board[nx][ny] = board[cx][cy] + 1;
                q.push({nx, ny});
            }
        }
    }
    
    // 输出结果
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cout << board[i][j] << " ";
        }
        cout << endl;
    }
    
    return 0;
}

注释说明:

● dx/dy数组:硬编码马的8个移动方向,减少重复计算。

● board初始化为-1:标记未访问状态,避免误判。

● BFS循环:通过队列逐层扩展,确保最短性。

● 边界检查:确保新位置合法,防止越界。

五、总结

本解法通过BFS算法,结合方向数组优化,实现了对马移动最短路径的高效求解。时间复杂度为O(nm),空间复杂度为O(nm),适用于大多数棋盘规模。该思路同样适用于其他类似“多源最短路径”问题,体现了BFS在形遍历中的通用性。掌握此类算法对提升算法设计与优化能力具有重要意义。


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣933题:队列的妙用:如何高效统计最近请求

力扣933题:队列的妙用:如何高效统计最近请求

题目重解:我们需要设计一个能统计最近3000毫秒内请求次数的系统。每当新的请求到来时,它会带有时间戳t,我们需要返回过去3000毫秒内(包括当前)发生的请求总数。这就像是在时间轴上维护一个滑动窗口,只...

2022年蓝桥杯省赛B组扫雷(洛谷P8785)解题全解析:代码+思路+步骤详解

2022年蓝桥杯省赛B组扫雷(洛谷P8785)解题全解析:代码+思路+步骤详解

一、题目解读2022年蓝桥杯省赛B组机器人塔(洛谷P8785)是一道经典的算法题目,要求处理在一个二维平面上布置的炸雷与排雷火箭。炸雷具有爆炸半径,当排雷火箭引爆后,会触发周围范围内未被引爆的炸雷,形...

洛谷1656题解:基于Tarjan算法求解割边问题(附代码与详细步骤)

洛谷1656题解:基于Tarjan算法求解割边问题(附代码与详细步骤)

一、题目解读洛谷1656题要求在无向图中找出所有割边(即删除后导致图不连通的边)。题目核心在于判断图的连通性,并识别哪些边是“桥”。需理解图论中的连通分量概念,以及如何通过算法高效定位割边。二、解题思...

洛谷P2190题解:铁路售票系统车厢计算(差分数组+前缀和优化)

洛谷P2190题解:铁路售票系统车厢计算(差分数组+前缀和优化)

一、题目解读洛谷P2190题要求解决铁路售票系统中的车厢数量计算问题。题目给定n个车站和m条订票申请,每条申请包含区间[x,y)及乘客数z。需要计算在不超载的情况下(每节车厢最多36人),满足所有乘客...

洛谷2652题解析:同花顺排序问题的动态规划与滑动窗口优化

洛谷2652题解析:同花顺排序问题的动态规划与滑动窗口优化

一、题目解读洛谷2652题要求对一组扑克牌进行排序,目标是找到最少需要调整的次数,使得所有牌形成同花顺。题目中,扑克牌由花色和数字组成,需先按花色排序,再在同花色内按数字排序。核心难点在于如何处理花色...

洛谷P3694题解:动态规划与状态压缩优化解题全解析

洛谷P3694题解:动态规划与状态压缩优化解题全解析

一、题目解读洛谷P3694题要求解决一个多团队人数分配问题,给定n个元素和m个团队,每个元素属于一个团队,需将元素重新排列,使相邻元素属于不同团队,并最小化调整次数。题目难点在于如何高效处理团队间的空...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。