classSolution{ publicintmovingCount(int m, int n, int k){ int count = 0; int[][] direction = {{0,1},{1,0}}; int[][] visited = newint[m][n]; visited[0][0] = 1; count = 1; Queue<int[]> queue = new LinkedList<>(); queue.offer(newint[]{0,0}); while (!queue.isEmpty()) { int[] cur = queue.poll(); int x = cur[0]; int y = cur[1]; for (int i = 0; i < 2; i++) {//四个方向,仔细想其实两个方向右和下就够了, //只有两个方向就可以到达全部的点 int nextx = x + direction[i][0]; int nexty = y + direction[i][1]; //三种情况,越界,访问过,不满足题意 if (nextx < 0 || nexty < 0 || nextx > m - 1 || nexty > n - 1) continue; if (visited[nextx][nexty] == 1) continue; boolean flag = judge(nextx,nexty,k); if (!flag) continue; visited[nextx][nexty] = 1; queue.offer(newint[]{nextx,nexty}); count++; } } return count; } publicbooleanjudge(int nextx, int nexty, int k){ return (getSum(nextx) + getSum(nexty)) <= k; } publicintgetSum(int a){//求位数和 if (a == 0) return0; return a % 10 + getSum(a / 10); } }
classSolution{ publicintmovingCount(int m, int n, int k){ visited = newint[m][n]; return dfs(0,0,k); } privateint[][] visited; publicintdfs(int x, int y, int k){ if (x < 0 || y < 0 || x > visited.length - 1 || y > visited[0].length - 1) return0; if (visited[x][y] == 1) return0; if (!judge(x, y, k)) return0; visited[x][y] = 1; int ans = 1;//自己1个节点 int[][] direction = {{0,1},{1,0},{0,-1},{-1,0}}; for (int i = 0; i < 4; i++) { int nextx = x + direction[i][0]; int nexty = y + direction[i][1]; ans += dfs(nextx, nexty,k); } return ans; } publicbooleanjudge(int nextx, int nexty, int k){ return (getSum(nextx) + getSum(nexty)) <= k; } publicintgetSum(int a){//求位数和 if (a == 0) return0; return a % 10 + getSum(a / 10); } }