糖逗 发表于 2020-4-6 13:52:53

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

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

题目描述:

地上有一个m行n列的方格,从坐标 到坐标 。一个机器人从坐标 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 ,因为3+5+3+7=18。但它不能进入方格 ,因为3+5+3+8=19。请问该机器人能够到达多少个格子?



示例 1:

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

输入:m = 3, n = 1, k = 0
输出:1
提示:

1 <= n,m <= 100
0 <= k <= 20


#include <iostream>
#include <queue>

using namespace std;


int sum(int n) {
    int s = 0;
    while (n > 0){
      s += n%10;
      n /= 10;
    }

    return s;
}



void bfs(int m, int n, int k, int& count, vector<vector<bool> >& visit, queue<pair<int, int> >& que) {
        pair<int, int> p(0, 0);
        while (!que.empty()) {
          p = que.front();
          que.pop();
       
          count++;
          if (p.first + 1 >= 0 && p.first + 1 < m && p.second >= 0 && p.second < n &&
                sum(p.first + 1) + sum(p.second) <= k && !visit) {
                que.push({p.first + 1, p.second});
                visit = true;
          }
       
          if (p.first >= 0 && p.first < m && p.second + 1 >= 0 && p.second + 1 < n &&
                sum(p.first) + sum(p.second + 1) <= k && !visit) {
                que.push({p.first, p.second + 1});
                visit = true;
          }
        }
}


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

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

    visit = true;
    bfs(m, n, k, c, visit, que);
    return c;
}



int main(void){
        int m, n, k;
        cin >> m;
        cin.clear();
        cin >> n;
        cin.clear();
        cin >> k;
        cin.clear();
        int res = movingCount(m, n, k);
        cout << res << endl;
        return 0;
       
}



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

糖逗 发表于 2020-4-6 13:53:37

这道题做的不好,还需要再做一遍。{:10_284:}
页: [1]
查看完整版本: C++刷剑指offer(面试题13. 机器人的运动范围)【广度优先搜索】【pair make_pair】