剑指 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的结论

结合什么可连通性,

易推出机器人可 仅通过向右和向下移动,访问所有可达解 。

于是可以去掉向左走和向上走的部分

原文地址:https://www.cnblogs.com/take-it-easy/p/14918830.html