剑指 Offer 13. 机器人的运动范围(BFS)
剑指 Offer 13. 机器人的运动范围
地上有一个m行n列的方格,从坐标 [0,0]
到坐标 [m-1,n-1]
。一个机器人从坐标 [0, 0]
的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?
示例 1:
输入:m = 2, n = 3, k = 1 输出:3
示例 2:
输入:m = 3, n = 1, k = 0 输出:1
提示:
1 <= n,m <= 100
0 <= k <= 20
1 class Solution { 2 public: 3 static constexpr int g_direction[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; 4 int getSingleSum(int x) { 5 int sum = 0; 6 while (x != 0) { 7 sum += x % 10; 8 x /= 10; 9 } 10 return sum; 11 } 12 int getSinglePositionSum(int x, int y) { 13 return (getSingleSum(x) + getSingleSum(y)); 14 } 15 void buildGraph(int k, vector<vector<int>> &graph) { 16 if (graph.size() <= 0 || graph[0].size() <= 0) { 17 return; 18 } 19 int row = graph.size(); 20 int cow = graph[0].size(); 21 for (int i = 0; i < row; i++) { 22 for (int j = 0; j < cow; j++) { 23 if (getSinglePositionSum(i, j) <= k) { 24 graph[i][j] = 1; 25 } 26 } 27 } 28 return; 29 } 30 int movingCount(int m, int n, int k) { 31 if (m <= 0 || n <= 0 || k < 0) { 32 return 0; 33 } 34 vector<vector<int>> graph(m, vector<int>(n, 0)); 35 // 构建机器人走的地图 36 buildGraph(k, graph); 37 queue<std::pair<int, int>> q; // 存储机器人可以走的方格坐标 38 q.push(make_pair(0, 0)); // 原点位置可以走先入栈 39 graph[0][0] = 2; // 0-不可以走,1-可以走,2-已走过 40 int ans = 1; // 可以走的方格数,原点位置可以走,默认1个方格可以走 41 while (!q.empty()) { 42 int x = q.front().first; 43 int y = q.front().second; 44 q.pop(); 45 // 遍历上、左、下、右四个方向,将可以走的方格坐标入队列 46 for (int i = 0; i < 4; i++) { 47 int xNext = x + g_direction[i][0]; 48 int yNext = y + g_direction[i][1]; 49 if ((xNext >= 0 && xNext < m) && (yNext >= 0 && yNext < n) && 50 (graph[xNext][yNext] == 1)) { 51 q.push(make_pair(xNext, yNext)); 52 graph[xNext][yNext] = 2; 53 ans++; 54 } 55 } 56 } 57 return ans; 58 } 59 };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!