package com.my.suanfa;
/*
* 用栈来求解汉诺塔问题的两种方法
* 方法一:递归实现
* 方法二:非递归实现,用栈来模拟递归,因为递归的本质上也是栈
* 前提条件:不能直接从左移动到右,也不能从右直接移动到左,而是必须经过中间
* */
public class Solution02 {
/*
* 方法一:递归实现n层汉诺塔
* 递归的结束条件:只剩一层,第n层,一共8种情况,分成两类
* 1.left-->mid, right-->mid, mid-->left, mid-->right,
* 相同点:起始柱子和目标柱子相邻,起始柱子或
* 者目标柱子其中有一个柱子必是mid
* 判断条件:from.equals(mid) || to.equals(mid)
* 移动过程:直接将此层from-->to,需要1步完成
* 2.left-->right, right-->left
* 移动过程:from-->mid,mid-->to,需要2步完成
* 递归继续条件:递归移动1--n层,一共8种情况,分成两类
* 1.left-->mid, right-->mid, mid-->left, mid-->right,
* 相同点:起始柱子和目标柱子相邻,起始柱子或
* 者目标柱子其中有一个柱子必是mid
* 判断条件:from.equals(mid) || to.equals(mid)
* 因为移动过程中是动态变化的,所以辅助柱子another是不定的,
* another = (from.equlas(left) || to.equlas(left))) ? right : left
* 移动过程:将1--n-1层:from-->anather,递归实现
* 将第n层:from-->to,需要1步完成
* 将1--n-1层:another-->to,递归实现
* 2.left-->right, right-->left
* 移动过程:将1--n-1层:from-->to,递归实现
* 将第n层:from-->mid,需要1步
* 将1--n-1层:to-->from,递归实现
* 将第n层:mid-->to,需要1步
* 将1--n-1层:from-->to,递归实现
*
* */
public int hanioProblem1(int num, String left, String mid, String right) {
if(num < 1) {
return 0;
}
return process(num, left, mid, right, left, right);
}
public int process(int num, String left, String mid, String right, String from, String to) {
if(num == 1) {
if(from.equals(mid) || to.equals(mid) ) {
System.out.println("move 1 from " + from + " to " + to);
return 1;
} else {
System.out.println("move 1 from " + from + " to " + mid);
System.out.println("move 1 from " + mid + " to " + to);
return 2;
}
}
if(from.equals(mid) || to.equals(mid)) {
String anather = (from.equals(left) || to.equals(left)) ? right : left;
int part1 = process(num - 1, left, mid, right, from, anather);
int part2 = 1;
System.out.println("move " + num + " from" + from + " to " + to);
int part3 = process(num - 1, left, mid, right, anather, to);
return part1 + part2 + part3;
} else {
int part1 = process(num - 1, left, mid, right, from, to);
int part2 = 1;
System.out.println("move " + num + " from " + from + " to " + mid);
int part3 = process(num - 1, left, mid, right, to, from);
int part4 = 1;
System.out.println("move " + num + " from " + mid + " to " + to);
int part5 = process(num - 1, left, mid, right, from, to);
return part1 + part2 + part3 + part4 + part5;
}
}
}
006-递归实现汉诺塔问题
最新推荐文章于 2023-08-15 20:59:18 发布