acm-杂 汉诺塔

问题是有三个插槽,n个由小到大的盘子怎么从第一个插槽移动到第三个插槽?其中小盘子只能放在大盘子上,一次只能移动一个盘子。
以3个盘子为例:

  1. 1号,2号移动到第二个插槽。1->2
  2. 3号移动到第三个插槽。1->3
  3. 1号,2号移动到第三个插槽。2->3
    其中第二步是直接可以完成的,也就是递归出口。
    第一步又可以分解为:
  4. 1号移动到第三个插槽。1->3
  5. 2号移动到第二个插槽。1->2
  6. 1号移动到第二个插槽。3->2
    第三部可以同样分解:
  7. 1号移动到第一个插槽。2->1
  8. 2号移动到第三个插槽。2->3
  9. 1号移动到第三个插槽。1->3
    一共需要移动3+1+3步,n个盘子需要n+1+n步。
    因为移动n个盘子同样可以以移动3个盘子为基础来理解。
    从插槽1移动n个盘子到插槽3:
  10. 前n-1个盘子移动到插槽二。
  11. 第n个盘子移动到插槽三。
  12. 前n-1个盘子在移动到插槽三。
    一步完成的直接完成,不可以直接完成的按上步分解。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;
    int move(int n,char x,char y,char z);
    printf("inter your number\n");
    scanf("%d",&n);
    move(n,'a','b','c');
    return 0;
}

int move(int n,char x,char y,char z){
    if(n==1){
        printf("%c-->%c\n",x,z);
    }
    else{
        move(n-1,x,z,y);
        printf("%c-->%c\n",x,z);
        move(n-1,y,x,z);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章