题解 | #机器人的运动范围#

机器人的运动范围

https://www.nowcoder.com/practice/6e5207314b5241fb83f2329e89fdecc8

#include <string>
#include <utility>

class Solution {
  public:
    int dx[4] = {-1, 1, 0, 0};
    int dy[4] = {0, 0, -1, 1};


    bool vis[101][101] = {false};
    bool ans_v[101][101]={false};
    // typedef struct the_point {
    //     int x;
    //     int y;
    //     the_point() {};
    //     the_point(int _x, int _y): x(_x), y(_y) {}
    //     bool operator<(const the_point& n) const {
    //         return x < n.x;
    //     }


    // };

    // set<the_point>see_set;
    set< pair<int, int> >new_set;

    int number_bit(int x) {
        // x=20;
        string tmpstr = to_string(x);
        int sum = 0;
        for (int i = 0; i < tmpstr.size(); i++) {
            sum += tmpstr[i] - '0';
        }
        // cout << x << " 的数位和为:" << sum << endl;
        return sum;
    }
    int dfs(int threshold, int cur_row, int cur_col, int rows, int cols) {
        if (cur_row < 0 || cur_row >= rows || cur_col < 0 || cur_col >= cols ||
                vis[cur_row][cur_col] ||
                number_bit(cur_row) + number_bit(cur_col) > threshold) {
            return -1;
        }
        vis[cur_row][cur_col] = true;
        // the_point tmp_point{cur_row, cur_col};
        // see_set.insert(tmp_point);
        // new_set.insert(make_pair(cur_row, cur_col));
        ans_v[cur_row][cur_col] = true;
        // cout << tmp_point.x << " " << tmp_point.y << endl;

        for (int i = 0; i < 4; i++) {
            int next_rows = cur_row + dx[i];
            int next_cols = cur_col + dy[i];

            dfs(threshold, next_rows, next_cols, rows, cols);
        }
        // vis[cur_row][cur_col] = false;
        return 0;
    }
    int movingCount(int threshold, int rows, int cols) {
        dfs( threshold, 0, 0,  rows,  cols);
        int cnt =0;
        for (int i=0; i<101; i++) {
            for (int j=0; j<101; j++) {
                if(ans_v[i][j])
                cnt++;
            }
        }
        return cnt;
    }
};

本题:其实无需回溯,这样会加大运行时间,导致过不去,当我注释掉 //vis[]时//
  便通过了,对结果也无影响。
  
  另外:本题也暴露了我的set集合不熟悉,当插入typedef时,需要在里面写一个  
  //     bool operator<(const the_point& n) const {
    //         return x < n.x;
    //     }
	没写就报错了。

全部评论

相关推荐

点赞 评论 收藏
分享
03-16 13:56
湖南大学 C++
牛客872108596号:到现在没消息是挂了吗查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务