算法题:汉诺塔

 

在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:
(1) 每次只能移动一个盘子;
(2) 盘子只能从柱子顶端滑出移到下一根柱子;
(3) 盘子只能叠在比它大的盘子上。

 

请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。

 

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/hanota-lcci

 

public static void movePlant(int size, List<Integer> first,List<Integer> second,List<Integer> third){
//如果只剩下一个盘子,直接将他从第一个柱子移动到第三个柱子
if (size == 1){
third.add(first.remove(first.size()-1));
return;
}
//首先将n-1个盘子,从第一个柱子移动到第二个柱子
movePlant(size-1,first,third,second);

//然后将最后一个盘子移动到第三个柱子上
third.add(first.remove(first.size()-1));

//最后将第二个柱子上的n-1个盘子,移动到第三个柱子上
movePlant(size -1 ,second,first,third);
}

 

 

分析:汉诺塔的考点是对递归的运用

posted @ 2022-02-09 10:39  光光1234  阅读(25)  评论(0编辑  收藏  举报