zoukankan      html  css  js  c++  java
  • 剑指 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的结论

    结合什么可连通性,

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

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

  • 相关阅读:
    JNA 简单示例
    WPF中使用VisiFire制作chart报表
    ActiveMQ CMS 开发环境编译
    c# 程序打包发布
    WPF 程序未处理异常 的捕获
    制作简易浏览器
    C#.NET 支持文件拖放
    C/S代码一例
    Delphi 2010 TStreamReader 和TStreamWriter
    Json数据使用及学习方法
  • 原文地址:https://www.cnblogs.com/take-it-easy/p/14918830.html
Copyright © 2011-2022 走看看