难度**

**中等

思路

BFS + 剪枝

  • 这题与数组匹配字符串相似,可以使用 BFS 算法解决问题。

    1. public class NO13_The_range_of_motion_of_the_robot {
    2. public static void main(String[] args) {
    3. System.out.println(movingCount_1(3, 2, 17));
    4. }
    5. static int total = 0;
    6. public static int movingCount_1(int m, int n, int k) {
    7. if (k == 0)
    8. return 1;
    9. boolean[][] array = new boolean[m][n];
    10. doRecursion(0, 0, k, array);
    11. return total;
    12. }
    13. private static boolean doRecursion(int i, int j, int k, boolean[][] array) {
    14. if (i < 0 || i > array.length - 1 || j < 0 || j > array[0].length - 1 || array[i][j])
    15. return false;
    16. int sum = i / 10 + i % 10 + j / 10 + j % 10;
    17. if (sum > k)
    18. return false;
    19. // 记录
    20. array[i][j] = true;
    21. boolean ret = doRecursion(i - 1, j, k, array)
    22. || doRecursion(i + 1, j, k, array)
    23. || doRecursion(i, j - 1, k, array)
    24. || doRecursion(i, j + 1, k, array);
    25. total++;
    26. return ret;
    27. }
    28. }

    | 时间复杂度 | O(n) | | —- | —- | | 空间复杂度 | O(mn) |


  • | 时间复杂度 | O(n) | | —- | —- | | 空间复杂度 | O(1) |

总结