鱼C论坛

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

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

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

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

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

x
本帖最后由 糖逗 于 2020-4-11 21: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
示例 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[p.first + 1][p.second]) {
                que.push({p.first + 1, p.second});
                visit[p.first + 1][p.second] = 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[p.first][p.second + 1]) {
                que.push({p.first, p.second + 1});
                visit[p.first][p.second + 1] = 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[p.first][p.second] = 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 ... -by-luo-jing-yu-yu/
2.pair make_pair 参考链接:https://blog.csdn.net/weixin_42825576/article/details/81571419
3.这里int&count 里边有&引用,可以改变count值。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-6 13:53:37 | 显示全部楼层
这道题做的不好,还需要再做一遍。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-15 12:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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