【剑指offer66 机器人的运动范围】

题目描述

地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
 
注意:机器人必须一格一格走,不能跨越不能到达的区域
 
class Solution {
    int get(int x) {
        //返回各位数值之和
        int res=0;
        for (; x; x /= 10){
            res += x % 10;
        }
        return res;
    }
    
public:  
    int movingCount(int k, int m, int n)
    {
        if(k<=0)return 0;
        if (!k) return 1; //k=0的情况
        int vis[m][n] ; //记录是否可访问到
        memset(vis,0,sizeof(vis));
        int ans = 1;
        vis[0][0] = 1;
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                //判断起点  以及  条件
                if ((i == 0 && j == 0) || get(i) + get(j) > k) continue;
                //满足条件后   边界判断   判断机器人是否能够移动到此点
                //只可能是从左边 或者上面过来的  所以只判断这两个方向可不可达就行
                //if (i - 1 >= 0) vis[i][j] |= vis[i - 1][j]; //或 等于  做或运算
                //if (j - 1 >= 0) vis[i][j] |= vis[i][j - 1];
                
                if (i - 1 >= 0 && vis[i-1][j])vis[i][j]=1; 
                if (j - 1 >= 0 && vis[i][j-1])vis[i][j]=1;
                ans += vis[i][j]; //如果不可达 自然为0
            }
        }
        return ans;
    }
};

 

posted @ 2020-06-15 21:03  Stephen~Jixing  阅读(185)  评论(0编辑  收藏  举报