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