0
点赞
收藏
分享

微信扫一扫

机器人的运动范围

耶也夜 2022-03-19 阅读 67

题目链接

思路

  • 题目给出的是一个矩形的方格,就是一个二维数组
    • 不能越界
    • 不能进入行坐标和列坐标的数位之和大于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
}
举报

相关推荐

0 条评论