求解汉诺塔问题

举报
牛哄哄的柯南 发表于 2022/06/28 13:41:03 2022/06/28
【摘要】 求解汉诺塔问题

求解汉诺塔问题

【常见题目】

题目描述:
给定一个由n个圆盘组成的塔,这些圆盘按照大小递减的方式套在第一根柱上。现要将整个塔移动到第三根柱上,每次只能移动一个圆盘,且较大的圆盘在移动过程中不能放置在较小的圆盘上面。
输入:
输入只有一个正整数n
输出:
接下来每一行输出一步移动步骤。

在此,我们讨论比较一种简单而且很好理解的做法——递归做法,既然递归,我们只要想好递归函数,其它的就交给函数吧。

【代码】

package pers.keafmd.accumulate.codeinterviewguide.hanoi;

import java.util.ArrayList;
import java.util.List;

/**
 * Keafmd
 *
 * @ClassName: ClassicTowerOfHanoi
 * @Description: 经典汉诺塔
 * @author: 牛哄哄的柯南
 * @date: 2022-06-27 19:08
 */
public class ClassicTowerOfHanoi {
    public int step = 1;

    public void hanoi(List<Integer> a,List<Integer> b,List<Integer> c){
        int n = a.size();
        move(n,a,b,c);
    }

    public void move(int n,List<Integer> a,List<Integer> b,List<Integer> c){
        if(n == 1){
            System.out.println("a:"+a+",b:"+b+",c:"+c);
            System.out.println("第"+step+++"步,把"+a.get(0)+"号从"+a+"移动到"+c);
            c.add(a.remove(a.size()-1));
            return;
        }
        // 最初 a是满的,所有盘子都在a上,b是空的,c是空的

        //三步走战略:
        //第一步:把a上面的n-1个盘子从a借助c移动到b上
        move(n-1,a,c,b);
        System.out.println("a:"+a+",b:"+b+",c:"+c);
        System.out.println("第"+step+++"步,把"+a.get(a.size()-1)+"号从"+a+"移动到"+c);
        //第二步:把a上面的最下面的那个盘子从a移动到c
        c.add(a.remove(a.size()-1));
        //第三步:把b上面的n-1个盘子借助a移动到c上
        move(n-1,b,a,c);
    }

    public static void main(String[] args) {
        List<Integer> aList = new ArrayList<>();
        List<Integer> bList = new ArrayList<>();
        List<Integer> cList = new ArrayList<>();

        aList.add(1);
        aList.add(2);
        aList.add(3);
        aList.add(4);
//        A.add(5);
//        A.add(6);

        ClassicTowerOfHanoi classicTowerOfHanoi = new ClassicTowerOfHanoi();
        classicTowerOfHanoi.hanoi(aList,bList,cList);

    }



}

测试效果:

a:[1, 2, 3, 4],b:[],c:[]1步,把1号从[1, 2, 3, 4]移动到[]
a:[1, 2, 3],b:[4],c:[]2步,把3号从[1, 2, 3]移动到[]
a:[4],b:[1, 2],c:[3]3步,把4号从[4]移动到[3]
a:[1, 2],b:[3, 4],c:[]4步,把2号从[1, 2]移动到[]
a:[3, 4],b:[2],c:[1]5步,把3号从[3, 4]移动到[1]
a:[3],b:[1, 4],c:[2]6步,把3号从[3]移动到[2]
a:[1, 4],b:[],c:[2, 3]7步,把1号从[1, 4]移动到[2, 3]
a:[1],b:[2, 3, 4],c:[]8步,把1号从[1]移动到[]
a:[2, 3, 4],b:[],c:[1]9步,把2号从[2, 3, 4]移动到[1]
a:[2, 3],b:[1, 4],c:[]10步,把3号从[2, 3]移动到[]
a:[1, 4],b:[2],c:[3]11步,把1号从[1, 4]移动到[3]
a:[2],b:[3, 4],c:[1]12步,把2号从[2]移动到[1]
a:[3, 4],b:[1, 2],c:[]13步,把3号从[3, 4]移动到[]
a:[3],b:[4],c:[1, 2]14步,把3号从[3]移动到[1, 2]
a:[4],b:[],c:[1, 2, 3]15步,把4号从[4]移动到[1, 2, 3]

Process finished with exit code 0
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。