java实现汉诺塔

73 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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))