剑指Offer13:机器人的运动范围(Java)

本文介绍了一种使用深度优先搜索(DFS)算法解决机器人路径规划问题的方法。机器人从(0,0)出发,目标是到达(m-1,n-1),过程中避免进入行坐标和列坐标之和大于k的格子。文章详细解释了如何通过优化搜索方向来提高效率,仅向右和向下搜索即可覆盖整个区域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:
在这里插入图片描述
解法思路:
    根据题目的意思,就是机器人从(0,0)出发,可以向上下左右走格子,目的地是(m-1,n-1),其中不能进入行坐标和列坐标之和大于k的格子,问这个小机器人最多能走几个格子?解决这道题最好的办法就是使用深度优先搜索(dfs)的办法。从起点出发,向四周走,当走出边界或者走到不符合规定的格子时,就回溯到上一个格子换成另一个方向。每走一个有效格子,记录一次。这样就能求出在m x n这片区域中,机器人能走过的所有格子数了。
    但是后来发现,走四个方向的运行时间有点长。经过大佬的指点,发现只需要走右和下两个方向就够了。因为这里求的是区域,刚好起点在区域的左上角,只走右边和下边两个方向,就已经能覆盖整个区域了。这样也减少了许多重复的操作。

代码实现:

class Solution {
    int m;
    int n;
    int[][] flag;
    public int movingCount(int m, int n, int k) {
        this.m=m;
        this.n=n;
        this.flag=new int[m][n];
        return bianli(0,0,k);
    }

    int bianli(int i, int j, int k) {
        if(i<0||i>=m||j<0||j>=n||sum(i,j)>k||flag[i][j]==1) return 0;
        flag[i][j]=1;
        int count=1;
        return count+bianli(i+1,j,k)+bianli(i,j+1,k);
    }

    int sum(int m, int n){
        int count=0;
        while(m!=0){
            count += m%10;
            m /= 10;
        }
        while(n!=0){
            count += n%10;
            n /= 10;
        }
        return count;
    }
}

执行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值