首页 > 其他 > 详细

acm-杂 汉诺塔

时间:2018-04-04 14:47:51      阅读:221      评论:0      收藏:0      [点我收藏+]
问题是有三个插槽,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-杂 汉诺塔

原文:http://blog.51cto.com/13688928/2094652

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!