题目

三个柱子 A、B、C。在A柱子从上到下 按照从小到大的顺序放置64盘子,命令将所有的盘子从A柱子移至C柱子,并且搬运过程中小盘子不能放在大盘子上面,且 在三根柱子之间一次只能移动一个盘子

clipboard.png

解题思路:

(1) 一个盘子 :

1: A--->C

clipboard.png

clipboard.png

(2) 两个盘子:
clipboard.png
clipboard.png

(3)三个盘子:

clipboard.png
clipboard.png

(4)四个盘子 :

clipboard.png

clipboard.png

总结:

用n表示盘子总数

(1)当只有一个盘子(n=1)的时候,直接从A到C;

(2)当有两个盘子(n=2)的时候,将第二根柱子B当做辅助柱,共三步;

第一个盘子(n-1)从A到B,第二个盘子(n)从A到C,第一个盘子(n-1)从B到C。

clipboard.png

(3)当盘子个数超过2(你>2)个时,其实就是 通过 递归 处理两个盘子(每次只走三步):(n-1)A—>B, (n)A-->C, (n-1)B-->C ;即:深度遍历二叉树

clipboard.png

clipboard.png

js代码:

//allSteps :用于存放移动的每一步骤
let allSteps=[];

/*
* 移动盘子的递归函数
* @param {number} n 当前处理的盘子
* @param {string} a , b ,c 代表当前的三根柱子
*/
function move(n,a,b,c){
  if(n===1){
    allSteps.push({
      n:n,
      from:a,
      to:c
    })
  }else{
    move(n-1,a,c,b);
    allSteps.push({
      n:n,
      from:a,
      to:c
    });
    move(n-1,b,a,c);
  }
}


二丽
280 声望8 粉丝