剑指OFFER_机器人的运动范围

剑指OFFER_机器人的运动范围

题目描述

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

思路

一开始我的思路是遍历每个格子,计算符合要求的格子数量;

后来发现可能不符合要求的格子会割裂整个地图,导致有些格子虽然满足条件,但是机器人无法到达;

所以设置一个递归函数,把能到达的格子判断一遍即可,代码如下:

代码

class Solution {
public:
    int w;
    int v;
    int limit;
    int *vis;
    int ans;
    bool check(int x, int y) {
        int res = 0;
        string str = to_string(x) + to_string(y);
        for (char &s:str) {
            int tmp = s-48;
            res += tmp;
        }
        if (res <= limit) {
            return true;
        } else {
            return false;
        }
    }
    void dfs(int x, int y) {
        if (x<0 || x>=v || y>=w || y<0)
            return;
        int pos = x*w+y;
        if (vis[pos] != 0)
            return;
        if (check(x, y)) {
            ++ans;
            vis[pos] = 1;
        } else {
            vis[pos] = -1;
            return;
        }
        dfs(x-1, y);
        dfs(x,y-1);
        dfs(x+1, y);
        dfs(x, y+1);
    }
    int movingCount(int threshold, int rows, int cols)
    {
        ans = 0;
        w = cols; v = rows; limit = threshold;
        vis = new int[rows*cols];
        memset(vis, 0, rows*cols*sizeof(int));
        dfs(0, 0);
        return ans;
    }
};

猜你喜欢

转载自www.cnblogs.com/sakurapiggy/p/13189077.html