剑指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 movingCount(int threshold, int rows, int cols)
    {
        if (0 == rows && 0 == cols)
            return 0;
        int Count = 0;
        //false未访问过, true访问过,不管是否满足条件
        vector<vector<bool> >flag(rows, vector<bool> (cols, false));
        DFS(rows, cols, 0, 0, flag, threshold, Count);
        return Count;
    }
    void DFS(int rows, int cols, int cur_rows, int cur_cols, vector<vector<bool> > &flag, int threshold, int &Count)
    {
        //这里不管是否满足条件,都置为true
        flag[cur_rows][cur_cols] = true;
        if(!IfSmallThanThreshold(cur_rows, cur_cols, threshold))
            return;

        ++Count;
        
        if (cur_rows < rows-1 && !flag[cur_rows + 1][cur_cols])
        {
            DFS(rows, cols, cur_rows+1, cur_cols, flag, threshold, Count);
        }
        if (cur_rows > 0 && !flag[cur_rows - 1][cur_cols])
        {
            DFS(rows, cols, cur_rows-1, cur_cols, flag, threshold, Count);
        }
        if (cur_cols > 0 && !flag[cur_rows][cur_cols-1])
        {
            DFS(rows, cols, cur_rows, cur_cols-1, flag, threshold, Count);
        }
        if (cur_cols < cols-1 && !flag[cur_rows][cur_cols+1])
        {
            DFS(rows, cols, cur_rows, cur_cols+1, flag, threshold, Count);
        }
    }
    bool IfSmallThanThreshold(int cur_rows, int cur_cols, int threshold)
    {
        int sum = 0;
        while(cur_rows != 0)
        {
            sum += cur_rows%10;
            cur_rows /= 10;
        }
        while(cur_cols != 0)
        {
            sum += cur_cols%10;
            cur_cols /= 10;
        }
        return sum <= threshold;
    }
};

//广度优先  
class Solution {
public:
    int movingCount(int threshold, int rows, int cols)
    {
        if (0 == rows && 0 == cols)
            return 0;
        if (!IfSmallThanThreshold(0,0,threshold))
            return 0;
        
        //false未访问过, true访问过,不管是否满足条件
        vector<vector<bool> >flag(rows, vector<bool> (cols, false));
        int Count = 0, cur_rows = 0, cur_cols = 0;
        queue<pair<int, int>> que;
        que.push(pair<int, int>(0,0));
        flag[0][0] = true;
        
        while(!que.empty())
        {
            pair<int, int> tmp = que.front();
            que.pop();
            cur_rows = tmp.first;
            cur_cols = tmp.second;
            
            if(!IfSmallThanThreshold(cur_rows, cur_cols, threshold))
                continue;
            ++Count;
            
            if (cur_rows < rows-1 && !flag[cur_rows + 1][cur_cols])
            {
                //一定要在这里面置为true,不能在上面,不然会有重复
                que.push(pair<int,int> (cur_rows + 1, cur_cols));
                flag[cur_rows + 1][cur_cols] = true;
            }
            if (cur_rows > 0 && !flag[cur_rows - 1][cur_cols])
            {
                que.push(pair<int,int> (cur_rows - 1, cur_cols));
                flag[cur_rows - 1][cur_cols] = true;
            }
            if (cur_cols > 0 && !flag[cur_rows][cur_cols - 1])
            {
                que.push(pair<int,int> (cur_rows, cur_cols - 1));
                flag[cur_rows][cur_cols - 1] = true;
            }
            if (cur_cols < cols-1 && !flag[cur_rows][cur_cols + 1])
            {
                que.push(pair<int,int> (cur_rows, cur_cols + 1));
                flag[cur_rows][cur_cols + 1] = true;
            }   
        }
        return Count;
    }
    
    bool IfSmallThanThreshold(int cur_rows, int cur_cols, int threshold)
    {
        int sum = 0;
        while(cur_rows != 0)
        {
            sum += cur_rows%10;
            cur_rows /= 10;
        }
        while(cur_cols != 0)
        {
            sum += cur_cols%10;
            cur_cols /= 10;
        }
        return sum <= threshold;
    }
};

猜你喜欢

转载自blog.csdn.net/pynash123/article/details/89068427