当前位置:首页 > 牛客 > 牛客25438题解析:机器人移动可达点数量的BFS算法优化

牛客25438题解析:机器人移动可达点数量的BFS算法优化

2个月前 (07-23)

牛客25438题解析:机器人移动可达点数量的BFS算法优化 牛客题解 BFS算法 广搜 广度优先搜索 队列 第1张

一、题目解读

牛客25438题要求计算在一个m行n列的网格中,从原点(0,0)出发,每次只能向上、下、左、右移动一步,且移动后的坐标各位数字之和不超过k的情况下,可达点的总数。题目考察对BFS广度优先搜索算法的应用,以及数字各位和的计算与边界条件的判断。

二、解题思路

采用BFS算法,通过队列存储待遍历的节点,并配合方向数组实现四方向移动。关键在于设计两个核心函数:

1. digitSum函数:通过循环取余和整除逐位拆解数字,计算各位之和。

2. isValid函数:综合判断坐标合法性(越界、数字和超限、是否已访问)。

主逻辑通过BFS从原点开始,遍历所有可达点并标记,最终统计总数量。

三、解题步骤

1. 预处理与初始化:输入m、n、k,创建visited矩阵标记访问状态,队列初始化原点。

2. BFS循环:

○ 取出队首节点,遍历四个方向偏移。

○ 调用isValid判断新坐标合法性,若合法则标记visited并入队,同时计数+1。

3. 终止条件:队列为空时结束,返回总计数。

四、代码和注释

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

// 计算数字各位之和
int digitSum(int num) {
    int sum = 0;
    while (num > 0) {
        sum += num % 10; // 取余得末尾数字
        num /= 10; // 去除末尾数字
    }
    return sum;
}

// 检查坐标是否合法
bool isValid(int x, int y, int m, int n, int k, vector<vector<bool>>& visited) {
    return x >= 0 && x < m && y >= 0 && y < n && 
           (digitSum(x) + digitSum(y)) <= k && 
          !visited[x][y];
}

int movingCount(int m, int n, int k) {
    if (m <= 0 || n <= 0 || k < 0) return 0; // 边界条件判断
    
    vector<vector<bool>> visited(m, vector<bool>(n, false)); // 初始化访问矩阵
    queue<pair<int, int>> q; // 存储待遍历坐标
    int count = 0; // 可达点计数
    
    // 初始位置(0,0)
    q.push({0, 0});
    visited[0][0] = true;
    count++;
    
    // 四个移动方向
    int dx[4] = {0, 1, 0, -1};
    int dy[4] = {1, 0, -1, 0};
    
    while (!q.empty()) {
        auto curr = q.front(); // 取出队首元素
        q.pop();
        
        for (int i = 0; i < 4; i++) {
            int nx = curr.first + dx[i];
            int ny = curr.second + dy[i];
            
            if (isValid(nx, ny, m, n, k, visited)) {
                visited[nx][ny] = true;
                q.push({nx, ny});
                count++;
            }
        }
    }
    
    return count;
}

int main() {
    int m, n, k;
    cin >> m >> n >> k;
    cout << movingCount(m, n, k) << endl;
    return 0;
}

代码注释说明:

● 主函数movingCount中,先判断输入合法性,避免无效参数导致错误。

● 使用方向数组dx、dy简化四方向偏移计算,提升代码可读性。

● 通过visited矩阵避免重复遍历,保证BFS正确性。

五、总结

该解法通过BFS算法结合自定义的数字各位和计算,高效解决网格可达点问题。时间复杂度为O(mn),空间复杂度为O(mn),适用于中等规模的网格场景。关键点在于合理设计辅助函数与边界判断,避免无效计算。实际应用中,可扩展至其他基于坐标限制的搜索问题,具有一定通用性。

原创内容 转载请注明出处

分享给朋友:

相关文章

洛谷1363题解法:虚拟坐标优化BFS解决循环迷宫问题(附代码详解)

洛谷1363题解法:虚拟坐标优化BFS解决循环迷宫问题(附代码详解)

一、题目解读洛谷1363题要求判断在给定大小的循环迷宫中,从起点出发是否可以通过移动到达多个不同的路径方向。迷宫由字符矩阵表示,'S'为起点,'#'为障碍物,其余为可通...

牛客232639题解析:双指针+排序算法高效求解三角形数量(附代码详解)

牛客232639题解析:双指针+排序算法高效求解三角形数量(附代码详解)

一、题目解读牛客232639题要求计算一个整数数组中能够组成有效三角形的三边组合数量。根据三角形不等式,三边需满足任意两边之和大于第三边。例如,数组[3, 4, 5, 6]可组成两个有效三角形([3,...

牛客4432题解题全解析:矩阵快速幂优化楼梯攀登问题(附C++代码)

牛客4432题解题全解析:矩阵快速幂优化楼梯攀登问题(附C++代码)

一、题目解读牛客4432题要求计算在n阶楼梯中,每次可爬1阶或2阶,共有多少种不同的攀登方式。该问题属于经典的动态规划类题目,需通过数学递推或矩阵乘法优化算法以应对较大数据规模。题目核心在于寻找高效计...

牛客4577题解:滑动窗口解法

牛客4577题解:滑动窗口解法

一、题目解读牛客4577题要求处理多组测试数据,每组包含一个整数数组crimes和两个参数n(数组长度)、t(阈值)、c(窗口大小)。题目需要统计数组中所有长度恰好为c的子数组,其元素和不超过t的数量...

牛客REAL645题解:动态规划求解朋友聚会问题(三维DP+状态转移优化)

牛客REAL645题解:动态规划求解朋友聚会问题(三维DP+状态转移优化)

一、题目解读牛客REAL645题要求解决一个朋友聚会安排问题:用户需每天邀请不同朋友(A/B/C)聚会,总天数为n,求所有可能的安排方案数。题目核心在于组合数学与状态约束——每日选择不能与前一天重复,...

牛客13279题解:基于广度优先搜索(BFS)计算树高度的算法优化与代码实现

牛客13279题解:基于广度优先搜索(BFS)计算树高度的算法优化与代码实现

一、题目解读牛客13279题要求计算给定树的高度。树由n个节点组成,通过n-1条边连接,形成一棵有根树。题目核心在于高效求解树的高度,即从根节点到最深叶子节点的最长路径长度。需要理解树的结构特点,选择...

发表评论

访客

看不清,换一张

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