题目描述
链接: https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof/
地上有一个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. 求机器人能够到达多少个格子.
解题思路
求能够到达多少个格子, 那么就要使用额外的数组来存储当前格子是否被访问过, 否则就会造成重复计数的情况.
并且每个格子都可以往上下左右四个方向移动, 我们从左上角[0, 0]移动, 所以每次只需要判断向右和向下的可达数量, 不需要再向左, 向上移动
DFS遍历
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| private int m, n, k; private boolean[][] visited;
public int movingCount(int m, int n, int k) { if (m <= 0 || n <= 0 || k < 0) { return 0; } this.m = m; this.n = n; this.k = k; this.visited = new boolean[m][n]; return dfs(0, 0, 0, 0); }
private int dfs(int i, int j, int sumI, int sumJ) { if (i >= m || j >= n || k < sumI + sumJ || visited[i][j]) { return 0; } visited[i][j] = true; return 1 + dfs(i + 1, j, sums(i + 1), sumJ) + dfs(i, j + 1, sumI, sums(j + 1)); }
private int sums(int x) { int s = 0; while (x != 0) { s += x % 10; x = x / 10; } return s; }
|