• 剑指 Offer 13. 机器人的运动范围


    剑指 Offer 13. 机器人的运动范围

    难度⭐⭐

    地上有一个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
    

    BFS

    class Solution:
        def movingCount(self, m: int, n: int, k: int) -> int:
            grid = [[0]*n for _ in range(m)]
            q = [[0,0]]
            count = 0
            while q:
                x,y = q.pop(0)
                #如果没有访问过 并且和小于k  就可以进入
                if grid[x][y] == 0 and sum(list(map(int,str(x)+str(y)))) <= k:
                    count += 1
                else:
                    continue
                grid[x][y] = 1
                for dx,dy in ([1,0],[0,1]):
                    nx, ny = x+dx, y+dy
                    if 0 <= nx < m and 0 <= ny <n:
                            q.append([nx,ny])
            return count
    
    import java.util.*;
    class Solution {
        public int movingCount(int m, int n, int k) {
        	// 创建队列
            Queue<int[]> queue = new LinkedList<int[]>();
            int[][] grid = new int[m][n];
            for (int i=0; i<m; i++){
                for (int j=0;j<n;j++){
                    grid[i][j] = 0;
                }
            }
    
            int count=0;
            queue.offer(new int[] {0,0});
            int[] dx = {0,1};
            int[] dy = {1,0};
            while (!queue.isEmpty()){
                int cor[] = queue.poll();
                int x = cor[0], y = cor[1];
                if (grid[x][y] == 0 && digitSum(x,y) <= k){
                    count += 1;
                }else{
                    continue;
                }
                grid[x][y] = 1;
                for (int i=0;i<2;i++){
                    int nx = x+dx[i];
                    int ny = y+dy[i];
                    if (nx>=0 && nx<m && ny>=0 && ny <n){
                        queue.offer(new int[] {nx,ny});
                    }
                }
            }
            return count;
        }
    
    	// 数位求和方法
        int digitSum(int x, int y){
            int sum = 0;
            while (x !=0 || y != 0){
                sum = sum + x%10 + y%10;
                x = x/10;
                y = y/10;
            }
            return sum;
        }
    
    }
    

    DFS

    python版一

    class Solution:
        def movingCount(self, m: int, n: int, k: int) -> int:
            def digitSum(x,y):
                ans = 0
                while x or y:
                    ans = ans+ x%10 + y%10
                    x, y = x//10,y//10
                return ans
    
            def dfs(x,y):
                #递归结束条件
                if x<0 or x>=m or y<0 or y>=n or grid[x][y]==1 or digitSum(x,y) > k:
                    return 0
                grid[x][y] = 1
                self.count += 1
                dfs(x+1,y)
                dfs(x,y+1)
    
            grid = [[0]*n for _ in range(m)]
            self.count = 0
            dfs(0,0)
            return self.count
    

    python版二

    class Solution:
        def movingCount(self, m: int, n: int, k: int) -> int:
            def digitSum(x,y):
                ans = 0
                while x or y:
                    ans = ans+ x%10 + y%10
                    x, y = x//10,y//10
                return ans
    
            def dfs(x,y):
                #递归结束条件
                if x<0 or x>=m or y<0 or y>=n or grid[x][y]==1 or digitSum(x,y) > k:
                    return 0
                grid[x][y] = 1
                return 1 + dfs(x+1,y) + dfs(x,y+1)
    
            grid = [[0]*n for _ in range(m)]
            return dfs(0,0)
    

    java递归版

    import java.util.*;
    class Solution {
        int m,n,k;
        boolean[][] grid;
    
        public int movingCount(int m, int n, int k) {
            this.m = m; this.n = n; this.k = k;
            grid = new boolean[m][n];
            return dfs(0,0);
        }
    
        int dfs(int x, int y){
            //递归结束条件
            if(x<0 || x>= m || y<0 || y>=n || grid[x][y]==true || digitSum(x,y) >k){
                return 0;
            }
            grid[x][y] = true;
            return 1 + dfs(x+1,y) + dfs(x,y+1);
        }
    
        int digitSum(int x, int y){
            int sum = 0;
            while (x !=0 || y != 0){
                sum = sum + x%10 + y%10;
                x = x/10;
                y = y/10;
            }
            return sum;
        }
    
    }
    

    java栈

    import java.util.*;
    class Solution {
        public int movingCount(int m, int n, int k) {
            Stack<int[]> stack = new Stack<int[]>();
            stack.push(new int[] {0,0});
            int count = 0;
            boolean[][] grid = new boolean[m][n];
            int[] dx = {1,0};
            int[] dy = {0,1};
            while(!stack.isEmpty()){
                int[] temp = stack.pop();
                int x = temp[0];
                int y = temp[1];
                //满足条件就加一
                if (x>=0 && x<m && y>=0 && y <n && grid[x][y] == false && digitSum(x,y) <= k){
                    count += 1;
                }else{
                    continue;
                }
                grid[x][y] = true;
                for(int i=0;i<2;i++){
                    int nx = x+dx[i];
                    int ny = y+dy[i];
                    stack.push(new int[] {nx,ny});
                }
            }
            return count;
        }
        int digitSum(int x, int y){
            int sum = 0;
            while (x !=0 || y != 0){
                sum = sum + x%10 + y%10;
                x = x/10;
                y = y/10;
            }
            return sum;
        }
    
    }
    
  • 相关阅读:
    Flink实例(117):FLINK-SQL应用场景(16)以upsert的方式读写Kafka数据——以Flink1.12为例(二)
    Flink实例(116):FLINK-SQL应用场景(15)以upsert的方式读写Kafka数据——以Flink1.12为例(一)
    数据挖掘实践(17):基础理论(十七)数据挖掘基础(四)模型解释
    数据挖掘实践(16):基础理论(十六)数据挖掘基础(三)特征工程(二)性能度量与评估方法
    rust 可变变量
    Rust学习(32):智能指针-Rc<T>
    rust 高级编程
    rust 所有权
    rust智能指针
    Anbox:容器中的 Android,anboxandroid
  • 原文地址:https://www.cnblogs.com/gongyanzh/p/13415374.html
Copyright © 2020-2023  润新知