题目链接
思路
- 题目给出的是一个矩形的方格,就是一个二维数组
- 不能越界
- 不能进入行坐标和列坐标的数位之和大于k的格子
- 我们需要创建一个同等长度的二位数组,来记录机器人走过的格子;
- 题意上面写,每次可以上下左右的走,但是起点是固定的[0,0];我们只需要向下或者向右走就可以了,不需要考虑向上或者向左;不然就会走入重复的格子
- 从[0,0]开始向下向右搜索,每搜索到一个节点就对当前节点进行判定,如果当前节点不越界;没有走过;并且行坐标和列坐标的数位之和不大于k就对当前节点进行记录;直至搜索到不满足条件后返回
java
public int movingCount(int m, int n, int k) {
boolean[][] arr = new boolean[m][n];
return dfs(0, 0, m, n, k, arr);
}
private int dfs(int x, int y, int m, int n, int k, boolean[][] arr) {
if (x >= m || y >= n || arr[x][y] || (get(x) + get(y)) > k) {
// 索引越界或当前节点已走过或者大于k
return 0;
}
// 将当前节点标记为已走过
arr[x][y] = true;
return 1 + dfs(x + 1, y, m, n, k, arr) + dfs(x, y + 1, m, n, k, arr);
}
private int get(int x) {
if (x < 10) {
return x;
}
int res = 0;
while (x != 0) {
res += x % 10;
x /= 10;
}
return res;
}
go
func movingCount(m int, n int, k int) int {
arr := make([][]bool, m)
for x := range arr {
arr[x] = make([]bool, n)
}
return dfs(0, 0, m, n, k, &arr)
}
func dfs(x, y, m, n, k int, arr *[][]bool) int {
if x >= m || y >= n || (*arr)[x][y] || (get(x)+get(y)) > k {
// 索引越界或当前节点已走过或者大于k
return 0
}
// 将当前节点标记为已走过
(*arr)[x][y] = true
return 1 + dfs(x+1, y, m, n, k, arr) + dfs(x, y+1, m, n, k, arr)
}
func get(x int) int {
if x < 10 {
return x
}
res := 0
for x != 0 {
res += x % 10
x /= 10
}
return res
}