zoukankan      html  css  js  c++  java
  • hanoi(老汉诺塔问题新思维)

    #include <stdio.h>  
    //第一个塔为初始塔,中间的塔为借用塔,最后一个塔为目标塔  
    int i=1;//记录步数  
    void move(int n, char from,char to) //将编号为n的盘子由from移动到to  
    {
         printf("第%d步:将%d号盘子%c---->%c
    ",i++,n,from,to);  
     
    }  
    void hanoi(int n,char from,char denpend_on,char to)//将n个盘子由初始塔移动到目标塔(利用借用塔)  
    {  
        if(n<1) return;
        if (n==1)  
        move(1,from,to);//只有一个盘子是直接将初塔上的盘子移动到目的地  
        else  
        {  
          hanoi(n-2,from,denpend_on,to);   
          move(n-1,from,denpend_on);               
          hanoi(n-2,to,from,denpend_on);
          move(n,from,to);
          hanoi(n-2,denpend_on,to,from);
          move(n-1,denpend_on,to);
          hanoi(n-2,from,denpend_on,to);
        }  
    }  
    void main()  
    {  
         printf("请输入盘子的个数:
    ");  
         int n;  
         scanf("%d",&n);  
         char x='A',y='B',z='C';  
         printf("盘子移动情况如下:
    ");  
         hanoi(n,x,y,z);  
    }  

    此解用于讲解原问题与子问题之间能建立合适的关系即可,无需要非要让n阶问题与n-1阶问题产生关系。

    n阶问题与其子问题n-2阶问题如下图所示:

  • 相关阅读:
    二叉排序树
    安全的终止线程的两种方法
    图的广度优先遍历(BFS)
    图的深度优先遍历(DFS)
    volatile的应用
    二叉树的遍历
    Java-反射
    Java--泛型
    单例模式
    剑指Offer--对称二叉树
  • 原文地址:https://www.cnblogs.com/ewitt/p/6801871.html
Copyright © 2011-2022 走看看