剑指 Offer 13. 机器人的运动范围

image.png

  1. class Solution {
  2. int ans = 0;
  3. public int movingCount(int m, int n, int k) {
  4. boolean[][] visited = new boolean[m][n];
  5. dfs(0, 0, m, n, k, visited);
  6. return ans;
  7. }
  8. /*思路: 向四个方向搜索,然后每个格子都进行判断,终止条件为超出边界和周围都不可达*/
  9. public void dfs(int mIdx, int nIdx, int m, int n, int k, boolean[][] visited) {
  10. if (mIdx<0 || mIdx>=m || nIdx<0 || nIdx>=n || visited[mIdx][nIdx]) {
  11. return;
  12. }
  13. int shuweihe = shuweihe(mIdx) + shuweihe(nIdx);
  14. if (shuweihe > k) {
  15. return;
  16. } else {
  17. ans++;
  18. }
  19. visited[mIdx][nIdx] = true;
  20. dfs(mIdx, nIdx-1, m, n, k, visited);
  21. dfs(mIdx, nIdx+1, m, n, k, visited);
  22. dfs(mIdx-1, nIdx, m, n, k, visited);
  23. dfs(mIdx+1, nIdx, m, n, k, visited);
  24. //visited[mIdx][nIdx] = false;
  25. }
  26. public int shuweihe(int num) {
  27. int res = num % 10;
  28. int chushu = num / 10;
  29. while (chushu != 0) {
  30. res += chushu % 10;
  31. chushu = chushu / 10;
  32. }
  33. return res;
  34. }
  35. }