zoukankan      html  css  js  c++  java
  • 剑指 Offer 13. 机器人的运动范围 bfs dfs

    地址 https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof/

    地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。
    一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),
    也不能进入行坐标和列坐标的数位之和大于k的格子。
    例如,当k为18时,机器人能够进入方格 [35, 37] ,
    因为3+5+3+7=18。但它不能进入方格 [35, 38],
    因为3+5+3+8=19。请问该机器人能够到达多少个格子?
    
     
    
    示例 1:
    
    输入:m = 2, n = 3, k = 1
    输出:3
    示例 2:
    
    输入:m = 3, n = 1, k = 0
    输出:1
    提示:
    
    1 <= n,m <= 100
    0 <= k <= 20
    
     

    解法  dfs遍历所有可能的格子

    class Solution {
    public:
        vector<vector<int>> vis;
        int addx[4] = {1,-1,0,0};
        int addy[4] = {0,0,-1,1};
        int ans;
        
        int Sumxy(int a){
            int ret = 0;
            while(a!=0){
                ret += a%10;
                a=a/10;
            }
            return ret;
        }
        
        void dfs(int x,int y,int k)
        {
            if( (Sumxy(x)+Sumxy(y)) >k || vis[x][y] == 1) return;
            
            vis[x][y]=1;
            ans++;
            
            for(int i = 0; i <4;i++){
                int newx = x+addx[i];
                int newy = y+addy[i];
                if(newx>=0 && newx<vis.size() && newy >=0 && newy < vis[0].size() && vis[newx][newy] == 0){
                    dfs(newx,newy,k);
                }
            }
            
            return;
        }
        
        
        int movingCount(int m, int n, int k) {
            vis = vector<vector<int>>(m,vector<int>(n)); 
            dfs(0,0,k);
            
            return ans;
        }
    };

     //==========================================================================================

    下面 来看看BFS

    class Solution {
    public:
        queue<pair<int,int>> q;
        int addx[4] = {1,-1,0,0};
        int addy[4] = {0,0,1,-1};
        vector<vector<int>> vis;
        int ans;
        
        int Sumxy(int a){
            int ret = 0;
            while(a!=0){
                ret += a%10;
                a=a/10;
            }
            return ret;
        }
        
        int movingCount(int m, int n, int k) {
            q.push({0,0});
            vis = vector<vector<int>>(m,vector<int>(n));
            vis[0][0]= 1;
            
            while(!q.empty()){
                pair<int,int> XY = q.front();q.pop();
                if(Sumxy(XY.first)+Sumxy(XY.second) >k) continue;
                ans++; 
                for(int i = 0;i < 4;i++){
                    int newx = XY.first+addx[i];
                    int newy = XY.second+addy[i];
                    
                    if(newx>=0 && newx<m && newy>=0 && newy<n && 0 == vis[newx][newy]){
                        vis[newx][newy] = 1;
                        q.push({newx,newy});
                    }
                }
            }
            
            return ans;
        }
    };
  • 相关阅读:
    循环结构进阶
    数组
    循环结构(二)
    循环结构(一)
    选择结构(二)
    选择结构(一)
    Ext tabpanel集成第三方charts(echarts、amcharts等)的问题(报getstyle为null的错误)
    JAVA调用.NET WebService终极方案(包含对SoapHeader的处理)
    【翻译】Organizing ASP.NET MVC solutions 如何组织你的ASP.NET MVC解决方案
    03、Kibana WEB安装配置
  • 原文地址:https://www.cnblogs.com/itdef/p/14249349.html
Copyright © 2011-2022 走看看