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

发布时间 2023-07-13 22:30:33作者: 小星code

题目链接:LeetCode 剑指 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. 使用一个二维的bool数组标记每个格子是否走过
2. 从左上角开始,一直尽可能的向右,向下走(因为每次都是选择没有走过的格子,初始时已经在左上角,因此一旦开始行走,无论当前在哪一个格子,它左边、上面的格子一定是已经是走过的)
3. 利用 除 10 取余的方式,求各位数字之和

代码1:

var ans int
var used [][]bool
func movingCount(m, n, k int) int {
    ans = 0   // 结果
    used = make([][]bool, m)  //创建一个二维bool数据,用来标记是否走过
    for i := range used {   
        used[i] = make([]bool, n)
    }
    bfs(m, n, 0, 0, k) 
    return ans
}
func bfs(m, n, x,y, k int) {
    if x >= m || y >= n || used[x][y] || getSum(x) + getSum(y) > k {  //如果越界、走过或者大于K ,直接返回
        return
    } 
    // 否则走这个格子
    used[x][y] = true   //标记当前格子已经走过
    ans++  //走过的格子加1
    bfs(m, n, x+1, y, k)  //向下走
    bfs(m, n, x, y+1, k)  //向右走
}

func getSum(n int) int { // 计算各位数字之和
    res := 0
    for n != 0 {
        res += n%10
        n /= 10
    }
    return res
}