剑指 Offer 13. 机器人的运动范围
这道题和之前的dfs+剪枝很像,但是有一个问题,就是如何去重
按道理前后左右都可以走,如果能走回去那不就走个不停了
但其实可以这样去重,第一次走到某个格子继续走,其他情况如果发现这个格子被走过直接结束
如何记录这个坐标呢,一开始傻了,想搞个hashset用来存放,但是问题是不太好放,于是发现可以再搞个大小一致的网格嘛,true和false用来记录是否访问过
于是代码如下:
class Solution { int res=0; public int movingCount(int m, int n, int k) { if (k==0 || m==1 && n==1) return 1; boolean[][] map=new boolean[m][n]; dfs(0,0,m,n,k,map); return res; } public void dfs(int i,int j,int m,int n,int k,boolean[][] map) { int sum=0; int i1=i; int j1=j; while(i1!=0) { sum+=i1%10; i1/=10; } while(j1!=0) { sum+=j1%10; j1/=10; } if(i<0||j<0||i>m-1||j>n-1||sum>k) { return; }//超出边界 if(map[i][j]==true) { return; } else { res+=1; map[i][j]=true; dfs(i+1,j,m,n,k,map); dfs(i,j+1,m,n,k,map); dfs(i-1,j,m,n,k,map); dfs(i,j-1,m,n,k,map); } } }
另外注意一下这个各个位数相加的方法,可能其他会用到
但是这里有个牛x的结论
结合什么可连通性,
易推出机器人可 仅通过向右和向下移动,访问所有可达解 。
于是可以去掉向左走和向上走的部分