AcWing 24 机器人的运动范围
发布日期:2021-05-28 16:30:15 浏览次数:22 分类:精选文章

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

机器人起始于坐标(0,0),每次只能上下左右移动一格,条件是不能进入行坐标与列坐标的数位之和超过k以内的格子。为了计算机器人能到达的所有格子的数量,可以使用广度优先搜索(BFS)来逐层扩展探索。BFS能够确保所有可达的格子都被计算到,并且避免重复访问,从而得出正确的结果。以下是解决方案的详细步骤:

  • 初始化结构:创建队列用于管理待访问的格子,并初始化一个二维数组用于记录已访问的格子。将起始格子(0,0)加入队列,并标记为已访问。

  • 定义方向数组:用于表示四个移动方向的增量,包括上下左右。

  • 数位和计算函数:一个辅助函数计算一个数的各位数字之和。例如,数25的二位数字之和为2+5=7。

  • BFS遍历过程

    • 取出队列中的当前格子,计入总数。
    • 对于四个方向,计算下一个可能的格子坐标。
    • 检查新坐标是否在合法范围内,未被访问过,且其数位之和不超过k。
    • 如果满足条件,将该坐标加入队列,并标记为已访问。
  • 边界处理:确保行坐标nx在0到rows-1之间,列坐标ny在0到cols-1之间。

  • 循环处理队列:直到队列为空,完成所有可达格子的遍历。

  • 通过这种方法,可以高效地解决问题,确保正确计数所有符合条件的格子。

    代码示例

    class Solution {public:    int movingCount(int threshold, int rows, int cols) {        if (rows == 0 || cols == 0) return 0;        int cnt = 0;        queue
    > q; bool inq[rows][cols]; memset(inq, 0, sizeof(inq)); q.push({0, 0}); inq[0][0] = 1; int dx[] = {0, 0, -1, 1}; int dy[] = {1, -1, 0, 0}; while (!q.empty()) { auto t = q.front(); q.pop(); cnt++; for (int i = 0; i < 4; ++i) { int nx = t.first + dx[i]; int ny = t.second + dy[i]; if (nx < 0 || nx >= rows || ny < 0 || ny >= cols) // 越界检查 continue; if (inq[nx][ny]) // 已访问过的格子不能再次访问 continue; if (sumDigits(nx) + sumDigits(ny) > threshold) // 数位和超过阈值,则被视为障碍 continue; inq[nx][ny] = 1; q.push({nx, ny}); } } return cnt; } int sumDigits(int n) { int ans = 0; while (n > 0) { ans += n % 10; n /= 10; } return ans; }};

    关键点分析

    • 初始化和输入检查:首先处理特殊情况,如rows或cols为0。
    • BFS队列处理:使用队列来逐层扩展,确保每个格子只被访问一次。
    • 数位和条件判断:对于每一步的新坐标,计算其数位之和,确保不超过阈值。
    • 边界和重复访问检查:防止越界和重复计算,确保算法的正确性和效率。

    通过上述步骤,机器人能够顺利到达合法的所有格子,统计出最终的可达格子数量。

    上一篇:AcWing 25 剪绳子
    下一篇:AcWing 23 矩阵中的路径

    发表评论

    最新留言

    留言是一种美德,欢迎回访!
    [***.207.175.100]2025年04月17日 21时31分34秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章