题目链接: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
}
标签:13,used,格子,Offer,int,机器人,bool,走过,LeetCode
From: https://www.cnblogs.com/lxing-go/p/17552375.html