鱼C论坛

 找回密码
 立即注册
查看: 1047|回复: 1

[技术交流] C++刷剑指offer(面试题13. 机器人的运动范围)【广度优先搜索】【pair make_pair】

[复制链接]
发表于 2020-4-6 13:52:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 糖逗 于 2020-4-11 21:13 编辑

题目描述:

  1. 地上有一个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。请问该机器人能够到达多少个格子?



  2. 示例 1:

  3. 输入:m = 2, n = 3, k = 1
  4. 输出:3
  5. 示例 1:

  6. 输入:m = 3, n = 1, k = 0
  7. 输出:1
  8. 提示:

  9. 1 <= n,m <= 100
  10. 0 <= k <= 20
复制代码


  1. #include <iostream>
  2. #include <queue>

  3. using namespace std;


  4. int sum(int n) {
  5.     int s = 0;
  6.     while (n > 0){
  7.         s += n%10;
  8.         n /= 10;
  9.     }

  10.     return s;
  11. }



  12. void bfs(int m, int n, int k, int& count, vector<vector<bool> >& visit, queue<pair<int, int> >& que) {
  13.         pair<int, int> p(0, 0);
  14.         while (!que.empty()) {
  15.             p = que.front();
  16.             que.pop();
  17.        
  18.             count++;
  19.             if (p.first + 1 >= 0 && p.first + 1 < m && p.second >= 0 && p.second < n &&
  20.                 sum(p.first + 1) + sum(p.second) <= k && !visit[p.first + 1][p.second]) {
  21.                 que.push({p.first + 1, p.second});
  22.                 visit[p.first + 1][p.second] = true;
  23.             }
  24.        
  25.             if (p.first >= 0 && p.first < m && p.second + 1 >= 0 && p.second + 1 < n &&
  26.                 sum(p.first) + sum(p.second + 1) <= k && !visit[p.first][p.second + 1]) {
  27.                 que.push({p.first, p.second + 1});
  28.                 visit[p.first][p.second + 1] = true;
  29.             }
  30.         }
  31. }


  32. int movingCount(int m, int n, int k) {
  33.     vector<vector<bool> > visit(m, vector<bool>(n, false));
  34.     int c = 0;
  35.     queue<pair<int, int> > que;

  36.     pair<int, int> p = make_pair(0, 0);
  37.     que.push(p);

  38.     visit[p.first][p.second] = true;
  39.     bfs(m, n, k, c, visit, que);
  40.     return c;
  41. }



  42. int main(void){
  43.         int m, n, k;
  44.         cin >> m;
  45.         cin.clear();
  46.         cin >> n;
  47.         cin.clear();
  48.         cin >> k;
  49.         cin.clear();
  50.         int res = movingCount(m, n, k);
  51.         cout << res << endl;
  52.         return 0;
  53.        
  54. }
复制代码




注意事项:
1.参考链接:https://leetcode-cn.com/problems ... -by-luo-jing-yu-yu/
2.pair make_pair 参考链接:https://blog.csdn.net/weixin_42825576/article/details/81571419
3.这里int&count 里边有&引用,可以改变count值。

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-6 13:53:37 | 显示全部楼层
这道题做的不好,还需要再做一遍。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-13 19:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表