2025-01-25 分治算法-汉诺塔问题
This commit is contained in:
parent
87a3082356
commit
ec201c8598
72
src/dataANDcalc/java/algorithm/HanoTower.java
Normal file
72
src/dataANDcalc/java/algorithm/HanoTower.java
Normal 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);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user