牛客网剑指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:
    //DFS,遍历的点在标记数组vis设为true后不复位,保证没有重复计算
    int movingCount(int threshold, int rows, int cols)
    {
        if (rows < 0 || cols < 0)
            return 0;
        bool *vis = new bool[rows*cols];
        for (int i = 0; i < rows*cols; ++i)
            vis[i] = false;
        cnt = 0;
        dfs(threshold, rows, cols, 0, vis);
        delete vis;
        return cnt;
    }
private:
    int dir[4][2] = {{1,0},{-1,0},{0,-1},{0,1}};
    int cnt = 0;
    int getDigitSum(int x)
    {
        int sum = 0;
        while (x)
        {
            sum += x%10;
            x /= 10;
        }
        return sum;
    }
    void dfs(int k, int rows, int cols, int now, bool *vis)
    {
        if (now < 0 || now >= rows*cols || vis[now])
            return;
        vis[now] = true;
        int r = now/cols, c = now%cols;
        int sum = getDigitSum(r) + getDigitSum(c);
        if (sum > k)
            return;
        ++cnt;
        for(int i = 0; i < 4; ++i)
            dfs(k, rows, cols, (r+dir[i][0])*cols + c+dir[i][1], vis);
    }
};

你可能感兴趣的:(剑指offer)