剑指offer--48.机器人的运动范围

这道题不是要求走一趟最多走多少,而是最多走多少,WA几次才想通。
--------------------------------------------------------------------------------------------------------------------
时间限制:1秒 空间限制:32768K 热度指数:142006

题目描述

地上有一个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(threshold<0) return 0;
            row = rows;
            col = cols;
            ct= 1 ;
            memset(ma, 0, sizeof(ma));
            ma[0][0] = 1;
            dfs(threshold,0,0);
            return ct;
        }
        void dfs(int k, int rr ,int cc) {
            for(int i=0; i<4; i++) {
                int c = dir[i][0] + cc;
                int r = dir[i][1] + rr;
                if(ma[r][c]==1 || c <0 || r<0 || c>=col || r>=row || sum_n(c, r) > k) continue;
                ma[r][c] = 1;
                ++ct; 
                dfs(k, r, c);
            }
        }
        int sum_n(int a, int b) {
            int sumab = 0;
            while (a != 0) {
                sumab += a%10;;
                a /= 10;
            }
            while (b != 0) {
                sumab += b%10;;
                b /= 10;
            }
            return sumab;
        }
    private:
        int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
        int ma[80][80];
        int row, col, ct;
};

 

posted @ 2019-03-31 15:48  朤尧  阅读(354)  评论(0编辑  收藏  举报