汉诺塔

【问题描述】

  有n个圆盘,依半径大小(半径都不同),自下而上套在A柱上,每次只允许移动最上面一个盘子到另外柱子上去(除A柱外,还有B柱和C柱,开始时这两个柱上无盘子),但绝不允许发生柱上出现大盘子在上,小盘子在下的情况,现要求设计将A柱子上n个盘子搬移到C柱去的方法。

【样例输入】

  3

【样例输出】

  1:x ----> z

  2:x ----> y

  3:z ----> y

  4:x ----> z

  5:y ----> x

  6:y ----> z

  7:x ----> z

  7

 

【过程分析】

 

 

#include<iostream>
using namespace std;
int cnt=0;

void hnt(int n, char x, char z, char y){
    if(n==0) return;
    // 假设n=2,则: 
    hnt(n-1, x, y, z); // x->y,所以z过度柱。
    cnt++;
    cout<<cnt<<" "<<x<<" ----> "<<z<<endl; // x->z 直接输出,不需要调用。 
    hnt(n-1,y, z, x); // y->z,所以x过度柱。    
} 

int main(){
    int n;
    cin>>n; 
    hnt(n,'x', 'z', 'y'); // y是过度柱。 
    cout<<cnt; 
    return 0;
} 

 

posted @ 2022-07-19 13:16  Hi,小董先生  阅读(144)  评论(0)    收藏  举报