2025-01-25 分治算法-汉诺塔问题

This commit is contained in:
liangjinglin 2025-01-25 15:47:06 +08:00
parent 87a3082356
commit ec201c8598

View File

@ -0,0 +1,72 @@
package algorithm;
import java.util.Stack;
public class HanoTower {
private Stack<Integer> towerA;
private Stack<Integer> towerB;
private Stack<Integer> towerC;
public HanoTower(int num){
towerA = new Stack<>();
towerB = new Stack<>();
towerC = new Stack<>();
for (int i = num; i > 0; i--) {
towerA.push(i);
}
}
public void move(String source, String target, String temp, int towerNum){
if(towerNum == 1){
Stack<Integer> sourceStack = null;
Stack<Integer> targetStack = null;
if(source.equals("A")){
sourceStack = towerA;
if(target.equals("B")){
targetStack = towerB;
} else if(target.equals("C")){
targetStack = towerC;
}
}
if(source.equals("B")){
sourceStack = towerB;
if(target.equals("A")){
targetStack = towerA;
} else if(target.equals("C")){
targetStack = towerC;
}
}
if(source.equals("C")){
sourceStack = towerC;
if(target.equals("A")){
targetStack = towerA;
} else if(target.equals("B")){
targetStack = towerB;
}
}
// 取出当前栈的头部盘子
int top = sourceStack.pop();
// 将盘子放入目标栈中
targetStack.push(top);
System.out.println("移动" + top + "号盘子,从" + source + "" + target);
return;
}
// 将所有的情况看成移动两个盘子
// 首先将上面的盘子移动到暂时塔中
move(source, temp, target, towerNum - 1);
// 然后将下面的盘子从原来的塔移动到目标塔中
move(source, target, temp, 1); // 这里的1实际上是towerNum - (towerNum - 1)
// 最后再将暂时塔的盘子移动到目标塔中
move(temp, target, source, towerNum - 1);
}
public static void main(String[] args) {
HanoTower hanoTower = new HanoTower(5);
hanoTower.move("A", "C", "B", 5);
}
}