汉诺塔问题实验报告

汉诺塔问题

问题描述

有 A,B,C 三根柱子,A 上面有 n 个盘子,我们想把 A 上面的盘子移动到 C 上,但是要满足以下三个条件:

每次只能移动一个盘子;
盘子只能从柱子顶端滑出移到下一根柱子;
盘子只能叠在比它大的盘子上。

解题思路

运用到递归与分治

假设 n = 1,只有一个盘子,很简单,直接把它从 A 中拿出来,移到 C 上;

如果 n = 2 呢?这时候我们就要借助 B 了,因为小盘子必须时刻都在大盘子上面,共需要 4 步。

如果 n > 2 呢?思路和上面是一样的,我们把 n 个盘子也看成两个部分,一部分有 1 个盘子,另一部分有 n - 1 个盘子。

算法思想

  • n = 1 时,直接把盘子从 A 移到 C;
  • n > 1 时,
    先把上面 n - 1 个盘子通过C从 A 移到 B(子问题,递归);
    再将最大的盘子从 A 移到 C;
    再将 B 上 n - 1 个盘子通过A从 B 移到 C(子问题,递归)。

代码

package com.hillky.mianshi6;

import java.util.List;
import java.util.Scanner;

public class m0806 {
    
    

    public static void Hanoi(int n, char A, char B, char C)
    {
    
    
        if (n == 1)
            //从A移动到C
            Move(1, A, C);
        else
        {
    
    
            //开始递归,先将n-1个东西从A通过C移动到B
            Hanoi(n - 1, A, C, B);
            //将第n块从A移动到C
            Move(n, A, C);
            //下一步递归,先将n-1个东西从B通过A移动到C
            Hanoi(n - 1, B, A, C);
        }
    }

    public static void Move(int n, char A, char B)
    {
    
    
        System.out.println("number "+n+":"+A+" ---> "+B);
    }

    public static void main(String[] args) {
    
    
        char	X = 'A';
        char	Y = 'B';
        char	Z = 'C';
        int		n;
        for (int i = 2; i < 8; i++) {
    
    
            System.out.println("盘子个数为: "+i);
            Hanoi(i,X,Y,Z);
            System.out.println("===================");
        }

    }

}

结果截图

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_51209821/article/details/127552993