剑指 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 };
复制代码

 

posted @   跳动的休止符  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示