洛谷P1443题:用BFS算法解决马走日问题

深度学习
• 阅读 3

洛谷P1443题:用BFS算法解决马走日问题

一、问题理解

题目要求计算马从初始位置出发,到达棋盘上每个位置的最少步数。马在国际象棋中走"日"字,有8种可能的移动方向。

二、算法选择

广度优先搜索(BFS)是解决这类最短路径问题的理想选择,因为:

1.BFS按层次遍历,第一次访问到某个位置时就是最短路径

2.天然适合处理网格类问题

3.实现简单直观

实现要点‌

1.队列管理‌:使用队列存储待访问的位置

2.方向数组‌:定义马移动的8个方向

3.访问标记‌:记录每个位置是否被访问过及步数

4.边界检查‌:确保移动后仍在棋盘范围内

三、完整代码

#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;
}

四、代码解析

代码主要分为以下几个部分:

1.输入处理和初始化

2.BFS主循环

3.结果输出

五、 关键点说明

1.方向数组dx和dy定义了马的所有可能移动

2.使用二维数组board记录步数,初始值为-1表示未访问

3.队列q存储待处理的网格位置

4.每次从队列取出当前位置,尝试8个方向移动

5.对新位置进行边界检查和访问检查

来源:洛谷题解

点赞
收藏
评论区
推荐文章
贾蔷 贾蔷
2个月前
力扣746:三步通关最小花费爬楼梯
题目解析:站在楼梯的某个台阶时,需要支付当前台阶对应的体力值costi,之后可以选择向上爬1或2个台阶。最终目标是到达‌楼层顶部‌(即数组末尾之后的位置),且初始位置可选择下标0或1的台阶作为起点。要求找出到达顶部的‌最小花费路径‌。例如输入cost
贾蔷 贾蔷
1个月前
2013 蓝桥杯 省赛B组 翻硬币(洛谷P8597题) 从暴力BFS到贪心算法的优化之路
一、问题背景与理解洛谷P8597是一道经典的翻硬币问题,题目描述如下:给定两个由''和'o'组成的字符串s1和s2,分别表示初始状态和目标状态。每次操作可以选择任意位置开始翻转连续的k个硬币(''变'o','o'变'')。要求计算出从初始状态变为目标状态所
贾蔷 贾蔷
1个月前
洛谷P11228地图探险题解(CSP-J 2024真题)
一、题目重述给定n×m的二维矩阵表示探险地图,每个格子可能是:平地('.')障碍物('')起点('S')终点('E')求从起点到终点的最短路径步数,无法到达则输出1。二、核心算法:BFS广度优先搜索选择原因:BFS是解决无权图最短路径问题的最优方案,时间复
贾蔷 贾蔷
1个月前
动态规划实战:洛谷P1220关路灯问题最优解(附C++代码 AC100)
一、问题重述题目描述:在一条笔直的道路上安装了N盏路灯,每盏灯有位置和功率。老张从某起点出发,每秒移动1单位距离,经过的灯可以关闭(节省电量)。要求计算关闭所有灯的最小耗电量。二、算法解析1.问题建模这是一个典型的区间DP问题,需要考虑:位置信息处理耗电量
深度学习 深度学习
1个月前
2024蓝桥杯省赛B组前缀总分(洛谷P12124)解题思路与代码详解
一、题目解读2024年蓝桥杯省B组题目“前缀总分”(对应洛谷P12124)要求计算给定字符串集合中,所有前缀的最长公共前缀(LCP)的总分,并找出通过移动字符位置后可能获得的最大总分。题目考察字符串处理与动态规划能力,需高效计算LCP并优化得分策略。二、解
深度学习 深度学习
1个月前
2024年蓝桥杯国赛A组题 九宫格全解析:基于BFS算法的代码实现与优化
2024年蓝桥杯国赛A组题九宫格全解析:基于BFS算法的代码实现与优化蓝桥杯国赛九宫格问题BFS算法代码解析解题步骤第1张一、题目解读2024年蓝桥杯国A的九宫格题目(对应洛谷P10578)要求通过旋转九宫格中的2x2区域,实现从初始状态到目标状态的转换,
深度学习 深度学习
3星期前
双指针法解决力扣922题:按奇偶排序数组II的完整指南
一、问题理解题目要求将一个重新,使得:1.所有偶数位于偶数位置(索引0,2,4...)1.所有奇数位于奇数索引位置(索引1,3,5...)1.不要求数字本身的排序,只需满足奇偶位置正确二、解法思路采用,分别维护两个:even指针:负责扫描偶数索引位置odd
深度学习 深度学习
3星期前
牛客网235698题:用滑动窗口寻找最多包含两种字符的最长子串
一、什么是?是一种用于处理/子区间问题的技术。它通过维护一个窗口(通常是子数组或子字符串),在遍历过程中动态调整窗口的边界,从而高效地解决问题。二、算法核心思想1.‌初始化窗口‌:通常从数组/字符串的起始位置开始1.‌扩展窗口‌:移动右边界,扩大窗口范围1
贾蔷 贾蔷
2星期前
2023年 GESP六级 小杨的握手问题的优雅解法:树状数组实战
一、问题背景与选择题目要求计算n个人按照特定顺序排队时发生的握手次数,本质上是计算序列中逆序对的数量。(FenwickTree)因其高效的和单点更新能力(O(logn))成为解决此类问题的理想选择。二、完整代码实现(带详细注释)Cincludeincl
深度学习 深度学习
5小时前
牛客4579题:钓鱼比赛——概率计算与比较
一、题目解读4579题要求解决一个基于网格的问题:给定一个n×m的,每个元素表示对应位置钓到鱼的概率。用户需根据输入的坐标(x,y)和尝试次数t,比较该位置钓到鱼的累积概率与全区域平均概率的累积概率,并输出结果("equal"、"cc"或"ss")。题目强