当前位置:首页 > 洛谷 > 洛谷P1747题解:遍历最短路径(BFS算法优化)

洛谷P1747题解:遍历最短路径(BFS算法优化)

7小时前

洛谷P1747题解:遍历最短路径(BFS算法优化) 洛谷题解 BFS算法 广度优先搜索 最短路径 广搜 队列结构 第1张

一、题目解读

洛谷P1747题目要求模拟中国象棋中“马”的移动规则,计算从任意起点到终点所需的最小步数。题目中马的移动方式包括传统的“日”字步(8种方向)及特殊“田”字步(4种方向),需在限定范围内寻找最短路径。问题核心在于利用图论算法解决多方向移动的最短路径问题。

二、解题思路

采用**广度优先搜索(BFS)**算法,其核心思想是逐层遍历所有可能状态,直到找到目标点。由于马的移动具有多种方向,需预先定义12种偏移量(dx、dy数组),通过队列维护待扩展节点。每次从队列取出当前节点,尝试所有合法移动方向,标记已访问状态并更新步数,直至到达终点。该算法保证首次到达终点的路径即为最短路径。

三、解题步骤

1. 初始化:定义队列q,访问标记visited数组,将起点入队并标记访问。

2. BFS循环:

    取出队头节点(当前位置及步数)。

    遍历12种移动方向,计算新坐标(nx, ny)。

    判断新坐标是否越界或已访问,若合法:

        若为新终点,返回当前步数+1;

        否则标记visited并加入队列,步数+1。

3. 终止条件:队列为空时,返回-1(理论上不会执行)。

四、代码与注释

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

const int MAXN = 50; // 棋盘最大范围
const int dx[] = {-2,-2,-1,-1,1,1,2,2,-2,2,-2,2};
const int dy[] = {-1,1,-2,2,-2,2,-1,1,-2,-2,2,2};

// 节点结构(坐标+步数)
struct Point {
    int x, y, steps;
};

// 核心BFS函数
int bfs(int startX, int startY) {
    if(startX == 1 && startY == 1) return 0; // 起点即终点直接返回0
    
    queue<Point> q;
    bool visited[MAXN][MAXN] = {false};
    q.push({startX, startY, 0}); // 起点入队
    visited[startX][startY] = true;
    
    while(!q.empty()) {
        Point current = q.front(); // 取出当前节点
        q.pop();
        
        for(int i = 0; i < 12; i++) { // 遍历12种移动方向
            int nx = current.x + dx[i];
            int ny = current.y + dy[i];
            
            if(nx < 1 || ny < 1 || nx >= MAXN || ny >= MAXN) continue; // 越界判断
            if(visited[nx][ny]) continue; // 已访问跳过
            
            if(nx == 1 && ny == 1) { // 到达终点
                return current.steps + 1;
            }
            
            visited[nx][ny] = true; // 标记访问
            q.push({nx, ny, current.steps + 1}); // 新节点入队
        }
    }
    return -1; // 理论上不会执行到这里
}

int main() {
    int x1, y1, x2, y2;
    cin >> x1 >> y1 >> x2 >> y2; // 输入两个起点坐标
    
    cout << bfs(x1, y1) << endl; // 输出两起点的最短路径
    cout << bfs(x2, y2) << endl;
    
    return 0;
}

五、总结

本解法利用BFS算法的“逐层扩散”特性,结合象棋马的多方向移动特点,通过预定义偏移量简化方向计算。算法时间复杂度为O(n^2),空间复杂度O(n^2)(标记数组),适用于求解中小规模棋盘的最短路径问题。在实际应用中,BFS常用于寻找无权的最短路径,其简洁性与效率使其成为图论基础算法之一。


原创内容 转载请注明出处

分享给朋友:

相关文章

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

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

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

洛谷P2346四子连珠游戏最短步数BFS解法详解

洛谷P2346四子连珠游戏最短步数BFS解法详解

一、题目解读洛谷P2346是一道经典的棋盘游戏问题,要求在一4x4黑白棋棋盘上,通过移动棋子使同色棋子形成四子一线(横、竖或对角线),计算达成目标所需的最少步数。题目考察BFS算法应用和状态空间搜索能...

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

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

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

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

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

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

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

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

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

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

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

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

发表评论

访客

看不清,换一张

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