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阶问题如下图所示:

原文地址:https://www.cnblogs.com/ewitt/p/6801871.html