使用Java实现汉诺塔问题~

我们设A为起始柱子,B为辅助柱子,C为目标柱子

由于盘子只能是大的放在下面,小的放在上面,因此,我们需要先将A柱子除了最下层的盘子都移动至B柱子

使用Java实现汉诺塔问题~_第1张图片

使用Java实现汉诺塔问题~_第2张图片

使用Java实现汉诺塔问题~_第3张图片

使用Java实现汉诺塔问题~_第4张图片

如下所示完成了最下层柱子到达它的最终位置,接下来,我们需要将B柱子上除了最下层的盘子之外的盘子移动至A,重复上述步骤

使用Java实现汉诺塔问题~_第5张图片

每次变化的点有两个:

1:柱子的功能

默认条件下,我们设置A为初始柱子,B为辅助柱子,C为目标柱子

设圆盘的个数为n

那么第一次我们需要将A柱子上的n-1个盘子借助C按照大小移动至B,由此B成为目标柱子,C为辅助柱子,当最下层的柱子到达C后,第一次完成(A为空柱子,B有n-1个盘子,C有1个盘子

那么第二次我们需要将B柱子上的n-1-1个盘子借助A按照大小移动至C,由此C成为目标柱子,A为辅助柱子,当最下层的柱子到达C后,第二次完成(A有n-1-1个盘子,B为空柱子,C有2个盘子

我们可以将除了最下层之外的n-1个圆盘看作一个整体,其实也就是2个盘子移动的问题,内部就是一个不断递归的过程

2:圆盘的数量

需要移动的圆盘的数量每次完成之后-1,而到达最终位置的圆盘数量每次完成之后+1

实现:

import java.util.Scanner;

public class test10 {
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            System.out.println("请输入圆盘的数量");
            int num = in.nextInt();
            hanoi(num, 'A', 'B', 'C');//起始柱、辅助柱、目标柱默认为A、B、C
        }
        public static void hanoi(int num, char a, char b, char c){
            if (num == 1) {
                System.out.println("第" + num + "个圆盘从" + a + " -> " + c);
            }else{
                //每当有一个盘子到达最终位置,目标柱和起始柱就要发生变化
                hanoi(num - 1, a, c, b);
                System.out.println("第" + num + "个圆盘从" + a + " -> " + c);
                hanoi(num - 1, b, a, c);
            }
        }
    }
请输入圆盘的数量
31个圆盘从A -> C2个圆盘从A -> B1个圆盘从C -> B3个圆盘从A -> C1个圆盘从B -> A2个圆盘从B -> C1个圆盘从A -> C

你可能感兴趣的:(算法刷题,java,开发语言,算法,蓝桥杯)