出处:左程云高级进阶班8
解法:
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个盘子
public static void main(String[] args) {
int[] arr = {1,1,1};
int[] arr2 = {3,3,3};
int[] arr3 = {3,2,1};
int n = process(arr, arr.length, 1,3,2);
System.out.println(n);
}
/**参数表示当前n处在哪个阶段,目标,将第n个盘子从s转移到*/
public static int process(int[] arr , int n ,int s, int e ,int o){
if(n ==1 && arr[n-1] == s)return 0;
if(n == 1 && arr[n-1] ==e) return 1;
if(arr[n-1] == o) return -1;
int res =0;
if(arr[n-1] ==s){
/**目标,将n-1个盘子从s转移到o*/
int valid = process(arr ,n -1,s, o, e);
if(valid == -1) return -1;
else {
res += process(arr ,n -1,s, o, e);
}
}else
if(arr[n-1] == e){
int valid = process(arr, n-1, o ,e, s);
if(valid== -1) return -1;
else {
res += Math.pow(2, n - 1) + process(arr, n - 1, o, e, s);
}
}
return res;
}
�