关于剑指offer回溯法章节13题机器人运动范围的另一种解法

回溯法方案

每次遇到未曾遍历的结点以递归的形式加1,再从该点出发,找他的上下左右点。

美墨围墙方案(误)

首先这是一个很容易理解的方案,目前我的理解也比较浅显,但是能在牛客上通过所有的测试用例,但是对于是否存在我未曾考虑到的边界情况,我个人也持有保留意见。

我是如何发现这个方案的

起初我在题目中忽略了只能上下左右移动这个条件,于是我尝试通过遍历所有(i,j)看数位和是否大于threshold,小于等于的count++;
在牛客上提示的测试用例中,对于threshold = 10, rows = 1, cols = 100的参数,count只有28个,在col = 28的位置到达上线,右移无法到达后续满足数位和的结点。
这是啥,这不是一个堵墙吗,走不过去了。
于是我想,在通常的rows > 1, cols > 1的情况下,机器人从(0,0)开始出发,最先遇到的一堵墙,墙内的格子便是需要返回的数值了。
于是在纸上画测试用例,发现能够遍历到的格子是自右上往左下的,于是撸代码:

public class Solution {
    public int movingCount(int threshold, int rows, int cols)
    {
        int count = 0;
        if(rows<1||cols<1){
            return count;
        }
        for(int row = 0; row < rows; row++){
            int m = row;
            int rowsum = 0;
            while(m!=0){
                rowsum += m % 10;
                m /= 10;
            }
            //当行的数位和超过阈值,列的不用考虑
            if(rowsum > threshold){
                break;
            }
            for(int col = 0; col < cols; col++){
                int n = col;
                int colsum = 0;
                while(n!=0){
                    colsum += n % 10;
                    n /= 10;
                }
                //当列的数位和超过阈值,行的不用考虑
                if(colsum > threshold){
                    break;
                }
                //满足条件count++
                if((rowsum + colsum) <= threshold){
                    count++;
                }
            }
        }
        return count;
    }
}

为什么是break呢,因为一旦遇到墙,后面就算数位和满足条件,也走不到了。

互勉

全部评论

相关推荐

服从性笔试吗,发这么多笔,现在还在发。
蟑螂恶霸zZ:傻 x 公司,发两次笔试,两次部门匹配挂,
投递金山WPS等公司10个岗位 >
点赞 评论 收藏
分享
我是小红是我:学校换成中南
点赞 评论 收藏
分享
2 收藏 评论
分享
牛客网
牛客企业服务