携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第32天,点击查看活动详情
Java实现汉诺塔
(一)汉诺塔的规则
1、有三根相邻的柱子,标号为A,B,C。
2、A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘。
3、现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。
(二)题解步骤
1、当n=1时;
将1号从A移动到C即可
2、当n=2时;
第一步:将1号从A移动到B
第二步:将2号从A移动到C
第三步:将1号从B移动到C
3、当n=3时;
第一步:将1号从A移动到C
第二步:将2号从A移动到B
第三步:将1号从C移动到B
第四步:将3号从A移动到C
第五步:将1号从B移动到A
第六步:将2号从B移动到C
第七步:将1号从A移动到C
......
由上述可以看出,每次都会有将最大的一个从A移动到C的步骤。假如有n(n>1)个需要移动的盘子,我们可以将这些步骤分为3步:
1、将1到n-1的盘子通过C的辅助从A移动到B
2、将第n个盘子移动到C
3、将1到n-1de盘子通过A辅助从B移动到C
由此我们可以想到用递归的方法。
package test1;
import java.util.*;
import java.util.Scanner;
/**
* @author 小徐同学
*
* 2021年10月30日
*/
public class shop {
//用于记录移动的次数
static int m = 0;
//展示函数
public static void move(int disk, char M, char N) {
System.out.println("第" + (++m) + "次操作,将" +
disk + "号盘从" + M + "移动到" + N);
}
public static void hanoi(int n, char A, char B, char C) {
if(n == 1) {
move(n, A, C);
}else {
hanoi(n - 1, A, C, B);
move(n, A, C);
hanoi(n - 1, B, A, C);
}
}
public static void main(String[] args) {
boolean i=true;
while(i){
Scanner in = new Scanner(System.in);
System.out.println("请您输入hanoi的个数:");
int a = in.nextInt();
hanoi(a, 'A', 'B', 'C');
System.out.println("总共使用" + m + "次");
}
}
}
结果
请您输入hanoi的个数:
3
第1次操作,将1号盘从A移动到C
第2次操作,将2号盘从A移动到B
第3次操作,将1号盘从C移动到B
第4次操作,将3号盘从A移动到C
第5次操作,将1号盘从B移动到A
第6次操作,将2号盘从B移动到C
第7次操作,将1号盘从A移动到C
总共使用7次
请您输入hanoi的个数:
各个算法的数值
排序算法 | 平均时间复杂度 |
---|---|
冒泡排序 | O(n²) |
冒泡排序 | O(n²) |
选择排序 | O(n²) |
插入排序 | O(n²) |
希尔排序 | O(n1.5) |
快速排序 | O(N*logN) |
归并排序 | O(N*logN) |
堆排序 | O(N*logN) |
基数排序 | O(d(n+r)) |