acm-杂 汉诺塔

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
    }
}

以上是关于acm-杂 汉诺塔的主要内容,如果未能解决你的问题,请参考以下文章

题解报告:hdu1996汉诺塔VI

题解报告:hdu1995汉诺塔V

HDU 1995 汉诺塔V

汉诺塔(记录每种路径次数)

HDU 1207 汉诺塔II (找规律,递推)

HDU 1996 汉诺塔VI