出处:左程云高级进阶班8

    image.png
    解法:
    step1: 汉诺塔是将1~n个盘子从start 转移到end,辅助柱子为other。
    step2:模拟汉诺塔搬运过程,第n个盘子的心路历程有

    • a: 将1~n-1个盘子从start转移到other
    • b:将第n个盘子从start 转移到end
    • c: 将1~n-1个盘子从other转移到end

    step3: 可以看到,第n个盘子搬运过程中,不会处在ohter柱子上,所以我们的递归函数参数定义为
    给定当前状态数组,返回达到当前状态的最优步骤数,
    尝试模型为,考察当前最大的盘子n所在的位置,大问题是从s柱子出发,目标是e柱子,辅助柱子是o,
    根据上面n的心路历程,有四种情况,即四种尝试分支,
    _/*参数表示当前n处在哪个阶段,目标,将第n个盘子从s转移到/
    _public static int process(int[] arr , int n ,int s, int e ,int o)
    代码:注意这里盘子从1开始编号,n表示第n个盘子

    1. public static void main(String[] args) {
    2. int[] arr = {1,1,1};
    3. int[] arr2 = {3,3,3};
    4. int[] arr3 = {3,2,1};
    5. int n = process(arr, arr.length, 1,3,2);
    6. System.out.println(n);
    7. }
    8. /**参数表示当前n处在哪个阶段,目标,将第n个盘子从s转移到*/
    9. public static int process(int[] arr , int n ,int s, int e ,int o){
    10. if(n ==1 && arr[n-1] == s)return 0;
    11. if(n == 1 && arr[n-1] ==e) return 1;
    12. if(arr[n-1] == o) return -1;
    13. int res =0;
    14. if(arr[n-1] ==s){
    15. /**目标,将n-1个盘子从s转移到o*/
    16. int valid = process(arr ,n -1,s, o, e);
    17. if(valid == -1) return -1;
    18. else {
    19. res += process(arr ,n -1,s, o, e);
    20. }
    21. }else
    22. if(arr[n-1] == e){
    23. int valid = process(arr, n-1, o ,e, s);
    24. if(valid== -1) return -1;
    25. else {
    26. res += Math.pow(2, n - 1) + process(arr, n - 1, o, e, s);
    27. }
    28. }
    29. return res;
    30. }