汉诺塔问题

题目

开始时所有圆盘都放在左边的柱子上,按照汉诺塔游戏的要求我们要把所有的圆盘都移到右边的柱子上,请实现一个函数打印最优移动轨迹。

给定一个int n,表示有n个圆盘。请返回一个string数组,其中的元素依次为每次移动的描述。描述格式为: move from [left/mid/right] to [left/mid/right]。

输入:1
返回:move from left to right

思路

  • n 层汉诺塔问题,要解决的是
    • 把 1 ~ n -1 层圆盘从left 移动到 mid ,可以借助 right
    • 最后把第 n 层移动到 right
  • n - 1 层汉诺塔问题,要解决的是
    • 把 1 ~ n - 2 层圆盘从 mid 移动到 left,可以借助的是 right
    • 最后把第 n - 1 层移动到 right
  • n - 2 层汉诺塔问题,要解决的是
    • 把 1 ~ n - 3 层圆盘从 left 移动到 mid,可以借助的是 right
    • 最后把第 n - 2 层移动 right
  • n - 3 层汉诺塔问题,要解决的是
    • 把 1 ~ n - 4 层圆盘从 mid 移动 left,可以借助的是 right
    • 最后把第 n - 3 层移动到 right
  • ...

可以发现这是两个过程不断在反复循环,都是借助 right,来把临时的头上的一堆塔移动到 left / mid,再从 left / mid 移动最底下的圆盘到 right 中去

最后,如果只剩下一个了,直接把它从 left 移动到 right 去

思考这个问题的重点是,left mid 和 right 是三个相对概念位置,在每一次过程都是相对改变的

class Hanoi {
    public ArrayList<String> getSolution(int n) {
        ArrayList<String> list = new ArrayList<>();
        move(n, "left", "right", "mid", list);
        return list;
    }

    private void move(int n,
                      String from,
                      String to,
                      String help,
                      ArrayList<String> list) {
        if (n == 1) {
            list.add("move from" + from + " to " + to);
        } else {
            move(n - 1, from, help, to, list);
            list.add("move from" + from + " to " + to);
            move(n - 1, help, to, from, list);
        }
    }
}

总结

今天复习左神的递归与 dp 课

全部评论

相关推荐

04-21 13:50
已编辑
北京理工大学 硬件测试
我们学校连夜发了声明,绝了绝了!看完了全部ppt,震碎三观。一般情况下我是站学生的,但这不是一般情况。这男的不能被取消学位吗?自己吃到了红利,靠着面试泄题得到的保研,又反手举报导师。这导师是《被举报系列》里最惨最恋爱脑的了,当然最可怜的是他的同妻……
牛客小黄鱼:看了ppt的聊天记录,真不知道谁才是受害者!有人为你剥过柚子吗?有人为你雪地里等你吗?有人为你写过情书吗?有人为你规划未来吗?有人为你小心翼翼吗?有人为你整页失眠失眠吗? 有人为你送上自己的科研成果吗?有人为你安排出国留学吗?有人愿意给你一个月2万吗?
点赞 评论 收藏
分享
头像
03-20 22:00
重庆大学 Java
适彼乐土:“他们不行再找你” 最后的底牌吗?有点意思
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务