码迷,mamicode.com
首页 > 其他好文 > 详细

acm-杂 汉诺塔

时间:2018-04-04 15:18:49      阅读:97      评论:0      收藏:0      [点我收藏+]

标签: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-杂 汉诺塔

标签:acm   汉诺塔   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!