码迷,mamicode.com
首页 > 其他好文 > 详细

剑指OFFER 机器人的运动范围

时间:2020-02-05 10:01:09      阅读:53      评论:0      收藏:0      [点我收藏+]

标签:运动   hand   int   需要   ack   ||   while   turn   矩形   

剑指OFFER 机器人的运动范围

矩形搜索的变形,可以深搜,也可以广搜. 思维上没有什么难度,但是需要细心.

深搜代码

class Solution {
public:
    
    int counter = 0;
    vector<pair<int,int> > rotate_fac;
    int m_threshold;
    int m_rows;
    int m_cols;
    vector<vector<bool> > matrix;

    bool check(int x,int y)
    {
        int sum = 0;
        int xx = x;
        int yy = y;
        while (xx != 0) {
            sum += xx % 10;
            xx /= 10;
        }
        while (yy != 0) {
            sum += yy % 10;
            yy /= 10;
        }
        if(x>=0 && y>=0 && x<m_rows && y<m_cols && matrix[x][y]==false && sum <= m_threshold)return true;
        else return false;
    }
    
    void recur(int x,int y)
    {
        matrix[x][y]=true;
        counter++;
        for(int i=0;i<4;i++)
        {
            if(check(x+rotate_fac[i].first,y+rotate_fac[i].second))
            {
                recur(x+rotate_fac[i].first,y+rotate_fac[i].second);
            }
        }
    }

    int movingCount(int threshold, int rows, int cols)
    {
        //handling special cases
        if (rows == 0 || cols == 0 || threshold < 0)return 0;

        //initialize
        counter = 0;
        m_threshold =  threshold;
        m_rows = rows;
        m_cols = cols;
        rotate_fac.push_back(pair<int,int>(0,1));
        rotate_fac.push_back(pair<int,int>(1,0));
        rotate_fac.push_back(pair<int,int>(0,-1));
        rotate_fac.push_back(pair<int,int>(-1,0));
        matrix.resize(rows);
        for(int i=0;i<rows;i++)
        {
            matrix[i].resize(cols);
        }
        
        recur(0,0);
        
        return counter;
    }
};

剑指OFFER 机器人的运动范围

标签:运动   hand   int   需要   ack   ||   while   turn   矩形   

原文地址:https://www.cnblogs.com/virgildevil/p/12262479.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!