关于剑指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呢,因为一旦遇到墙,后面就算数位和满足条件,也走不到了。
互勉