牛客网25438题:BFS算法解机器人移动范围问题
一、题目解读
题目要求计算机器人从m×n网格的(0,0)出发,可到达的格子数量。移动规则:每次只能向上下左右移动,且目标位置的数位和不超过给定阈值k。例如当k=8时,(35,37)的数位和3+5+3+7=18>8不可达。这是典型的图遍历问题,适合用BFS/DFS解决。
二、解题思路
数位和计算:通过digitSum函数分解数字各位相加
合法性校验:isValid函数综合判断坐标边界、访问状态和数位和阈值
BFS核心逻辑:
使用队列实现广度优先遍历
从(0,0)出发,标记已访问
每次扩展四个方向的相邻格子
合法则加入队列并计数
三、解题步骤
初始化visited矩阵和计数变量
将起点(0,0)入队并标记
循环处理队列直到为空:
取出队首元素
检查四个移动方向的新坐标
若坐标合法则标记访问并入队
返回最终的计数结果
四、完整代码实现
#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; }
五、总结
本题通过BFS实现了高效的网格遍历,关键在于:
原创内容 转载请注明出处